/ / Obmedzenie číslic v regulárnej zhode - java, android, regex, regex-negation, regex-lookarounds

Obmedzenie číslic v regexovom zápase - java, android, regex, regex-negation, regex-lookarounds

tl; dr: Ako môžem nastaviť obmedzenie počtu na konkrétny token v regulárnom slovníku.

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

Snažil som sa nájsť telefónne číslo v textovom bloku. Platformy Android Patterns trieda poskytuje primerané pokrytie. Ale primárny problém má

  • Nemá minimálnu dĺžku
  • Nemá maximálnu dĺžku

Takže sa skutočne zhoduje 1234 a tiež, keď existuje reťazec ako my phone numbers are +19447223311 872881122, porovnáva obe čísla ako jedno číslo. Ak môžeme pridať obmedzenie, že vzor by mal mať číslice {7,12}, myslím, že to vyrieši oboje. Toľko, čo som sa snažil nemohol fungovať. Tu je regulárny vzor.

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>

odpovede:

0 pre odpoveď č. 1

Neexistuje nič také regex obmedzenia v systéme Android a ako PHONE vzor je predkompilovaný, môžete ho tiež rozšíriť.

Chcel by som to takto:

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));
}
}

čo dáva tento výsledok:

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