JavaScript - как проверить регулярное выражение, чтобы убедиться, что строка содержит хотя бы одну последовательность букв / цифр?

Я нашел EndCallListener наиболее функциональный пример, чтобы описать поведение (finish (), call, restart). Я добавил несколько SharedPreferences, чтобы у Listener была ссылка для управления этим поведением.

My OnClick, initialise и EndCallListener реагируют только на вызовы из приложения. Другие вызовы игнорируются.

import android.content.Intent;
import android.content.SharedPreferences;
import android.preference.PreferenceManager;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.util.Log;

public class EndCallListener extends PhoneStateListener {

private String TAG ="EndCallListener";
private int     LAUNCHED = -1;

SharedPreferences prefs = PreferenceManager
                            .getDefaultSharedPreferences(
                                myActivity.mApp.getBaseContext());

SharedPreferences.Editor _ed = prefs.edit();

@Override
    public void onCallStateChanged(int state, String incomingNumber) {
    String _prefKey = myActivity.mApp                          
                      .getResources().getString(R.string.last_phone_call_state_key),
    _bPartyNumber = myActivity.mApp                           
                      .getResources().getString(R.string.last_phone_call_bparty_key);

    int mLastCallState = prefs.getInt(_prefKey, LAUNCHED);

    //Save current call sate for next call
    _ed.putInt(_prefKey,state);
    _ed.commit();

        if(TelephonyManager.CALL_STATE_RINGING == state) {
            Log.i(TAG, " >> RINGING, number: " + incomingNumber);
        }
        if(TelephonyManager.CALL_STATE_IDLE == state && mLastCallState != LAUNCHED ) {
            //when this state occurs, and your flag is set, restart your app

            if (incomingNumber.equals(_bPartyNumber) == true) {
                //Call relates to last app initiated call
            Intent  _startMyActivity =  
               myActivity.mApp                               
               .getPackageManager()                                  
               .getLaunchIntentForPackage(
                 myActivity.mApp.getResources()
                 .getString(R.string.figjam_package_path));

_startMyActivity.setAction(                                     
        myActivity.mApp.getResources()
        .getString(R.string.main_show_phone_call_list));

                myActivity.mApp
                        .startActivity(_startMyActivity);
                Log.i(TAG, "IDLE >> Starting MyActivity with intent");
            }
            else
                Log.i(TAG, "IDLE after calling "+incomingNumber);

        }

    }
}

добавьте их в strings.xml

<string name="main_show_phone_call_list">android.intent.action.SHOW_PHONE_CALL_LIST</string>
<string name="last_phone_call_state_key">activityLpcsKey</string>
<string name="last_phone_call_bparty_key">activityLpbpKey</string>

и что-то вроде этого в вашем манифесте, если вам нужно вернуться к внешнему виду перед вызовом

  <activity android:label="@string/app_name" android:name="com.myPackage.myActivity" 
      android:windowSoftInputMode="stateHidden"
        android:configChanges="keyboardHidden" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <action android:name="android.intent.action.SHOW_PHONE_CALL_LIST" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
  </activity>

и поместите их в свой «myActivity»

public static Activity mApp=null; //Before onCreate()
  ...
onCreate( ... ) {
  ...
if (mApp == null) mApp = this; //Links your resources to other classes
  ...
    //Test if we've been called to show phone call list
    Intent _outcome = getIntent();
    String _phoneCallAction = mApp.getResources().getString(R.string.main_show_phone_call_list);
    String _reqAction = _outcome.getAction();//Can be null when no intent involved

         //Decide if we return to the Phone Call List view
         if (_reqAction != null &&_reqAction.equals(_phoneCallAction) == true) {
                         //DO something to return to look and feel
         }

  ...
        myListView.setOnItemClickListener(new OnItemClickListener() { //Act on item when selected
             @Override
             public void onItemClick(AdapterView<?> a, View v, int position, long id) {

                 myListView.moveToPosition(position);
                 String _bPartyNumber = "tel:"+myListView.getString(myListView.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); 

                 //Provide an initial state for the listener to access.
                 initialiseCallStatePreferences(_bPartyNumber);

                 //Setup the listener so we can restart myActivity
                    EndCallListener _callListener = new EndCallListener();
                    TelephonyManager _TM = (TelephonyManager)mApp.getSystemService(Context.TELEPHONY_SERVICE);

                    _TM.listen(_callListener, PhoneStateListener.LISTEN_CALL_STATE);

                         Intent _makeCall = new Intent(Intent.ACTION_CALL, Uri.parse(_bPartyNumber));

                 _makeCall.setComponent(new ComponentName("com.android.phone","com.android.phone.OutgoingCallBroadcaster"));
                    startActivity(_makeCall);                           
                finish();
              //Wait for call to enter the IDLE state and then we will be recalled by _callListener
              }
        });


}//end of onCreate()

, используйте это, чтобы инициализировать поведение вашего onClick в myActivity, например после onCreate ()

private void initialiseCallStatePreferences(String _BParty) {
    final int LAUNCHED = -1;
    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(
                                mApp.getBaseContext());
    SharedPreferences.Editor _ed = prefs.edit();

    String _prefKey = mApp.getString(R.string.last_phone_call_state_key),
           _bPartyKey = mApp.getString(R.string.last_phone_call_bparty_key);

    //Save default call state before next call
        _ed.putInt(_prefKey,LAUNCHED);
        _ed.putString(_bPartyKey,_BParty);
        _ed.commit();

}

Вы должны найти, что нажатие вашего списка телефонных номеров завершает вашу активность, делает звонок на номер и возвращается к вашей активности, когда вызов заканчивается.

Выполнение вызова извне вашего приложения в то время, когда оно все еще вокруг, не перезапустит вашу активность (если это не совпадает с последним номером BParty).

:)

0
задан Stevie Star 15 January 2019 в 21:30
поделиться

4 ответа

Я думаю, что вы ищете следующее выражение:

/^((0?[1-9]|1[0-2])h)?((([0-5]?[0-9])|60)m)?((([0-5]?[0-9])|60)s)?$/

У вашего исходного выражения есть две основные проблемы: 1. \d в конце и 2. захват области (обратите внимание на дополнительную Паренс в моем выражении).

Это также будет захватывать: 1h13s

0
ответ дан do or do not 15 January 2019 в 21:30
поделиться

Попробуйте:

^(\d{0,2}[hms]){0,3}$

примеры: https://regex101.com/r/NV6oEu/1

0
ответ дан Thomas Skubicki 15 January 2019 в 21:30
поделиться

Вам нужно сделать каждый раздел регулярного выражения необязательным, чтобы вы могли опустить этот блок.

Вам нужно взять [h] из одной из альтернатив - вы соответствуете 12h, но не 01h.

У вас не должно быть \d в конце.

Вы не можете использовать однозначные минуты или секунды. Там также нет необходимости в 60 или 60 м, так как это 1 м и 1 ч.

/^((0?[1-9]|1[0-2])h)?([1-5]?[0-9]m)?([1-5]?[0-9]s)?$/

DEMO

Нет необходимости заключать h, m и s в квадратные скобки, так как они представляют собой одиночные символы. ]

Обратите внимание, что поскольку каждая единица является необязательной, она также будет соответствовать пустой строке. Вы должны проверить это отдельно от регулярного выражения.

0
ответ дан Barmar 15 January 2019 в 21:30
поделиться

может быть, этот будет работать

\d+\w+

Если я правильно вас понял, вы пытаетесь проверить строку, содержащую символы после чисел

0
ответ дан duc mai 15 January 2019 в 21:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: