/ / Restrizione delle cifre in una corrispondenza regolare - java, android, regex, regex-negation, regex-lookarounds

Limitazione delle cifre in una corrispondenza regolare - java, android, regex, regex-negation, regex-lookarounds

tl; dr: Come posso impostare un vincolo di conteggio su un particolare token in un'espressione regolare.

(regex-exp){constraint:max 10 only digits}

Ho cercato di trovare un numero di telefono in un blocco di testo. Piattaforme Android Patterns la classe offre una copertura ragionevole. Ma il problema principale ce l'ha

  • Non ha una lunghezza minima
  • Non ha una lunghezza massima

Quindi corrisponde effettivamente anche 1234 e anche quando c'è una stringa simile my phone numbers are +19447223311 872881122, corrisponde a entrambi i numeri come un numero singolo. Se possiamo aggiungere un vincolo che il modello dovrebbe avere cifre {7,12}, risolverà per entrambi credo. Per quanto ho provato, non ho potuto farlo funzionare. Ecco la regex per il pattern.

public static final Pattern PHONE
= Pattern.compile(                      // sdd = space, dot, or dash

"(\+[0-9]+[\- \.]*)?"        // +<digits><sdd>*

+ "(\([0-9]+\)[\- \.]*)?"   // (<digits>)<sdd>*

+ "([0-9][0-9\- \.]+[0-9])"); // <digit><digit|sdd>+<digit>

risposte:

0 per risposta № 1

Non esiste una cosa del genere regex constraint in Android e come PHONE il modello è precompilato, non è possibile estenderlo.

Lo farei così:

Pattern constraint = Pattern.compile("\+?\d{7,12}");
Matcher constraint_matcher = constraint.matcher("I will be home by 12:30 and if you have anything " +
"urgent call me at 901 101 0101, and my extension is 1021 +19447223311  872881122    ");

while (constraint_matcher.find()) {

Matcher phone_number_matcher = Patterns.PHONE.matcher(constraint_matcher.group(0));

if (phone_number_matcher.find()) {
Log.d("MATCH", phone_number_matcher.group(0));
}
}

che dà questo risultato:

09-15 16:20:34.277 10119-10119/com.example D/MATCH: +19447223311
09-15 16:20:34.277 10119-10119/com.example D/MATCH: 872881122