регулярное выражение, чтобы соответствовать последовательности не буквенных символов, по крайней мере, n цифр - PullRequest
1 голос
/ 11 марта 2011

Я ищу регулярное выражение для использования в Java (java.util.regex.Pattern), которое будет соответствовать обобщенной форме телефонного номера. Я указал это как:

последовательность из не менее 8 не-буквенных символов, из которых не менее 8 символов являются цифрами.

Например, строковый литерал с положительным соответствием будет:

"Тел: (011) 1234-1234 бла-бла-бла"

однако следующий строковый литерал будет не соответствовать:

"Fot 3 ..... a 3 бла-бла-бла"

Я дошел до последовательности, состоящей как минимум из 8 буквенных символов

Pattern.compile("[^\\p{L}]{8,}");

Как я могу добавить "и" / "конъюнктивное ограничение" к этому регулярному выражению, указав [\ d] {8,}

Я видел этот пост на stackoverflow:

Регулярные выражения: есть оператор AND?

Об "anding" выражениях регулярных выражений, но я не могу заставить их работать.

Любая помощь или предложения, очень приветствую:

Simon

Ответы [ 4 ]

2 голосов
/ 11 марта 2011

Если вы ищете телефонные номера в неструктурированных документах, то есть где телефонные номера могут быть выражены любым количеством способов (с префиксами int или без них, скобками вокруг кодов городов, тире, переменным числом цифр, случайным образом разбитых напробел и т. д.) и где вы можете получить множество номеров, которые наивно похожи на номера телефонов, но не являются (например, в Интернете), если серьезно, забудьте об использовании регулярных выражений.

Вам гораздо лучше писатьваш собственный парсер.По сути, это пошагово просматривает ваш текст по одному символу за раз, и вы можете добавлять к нему любые правила, которые вам нравятся.Такой подход также значительно упрощает сопоставление с реальными телефонными номерами (например, действительными международными или региональными кодами или другими правилами, которые могут иметь местные или национальные обмены) и, таким образом, сокращает количество ложных срабатываний.Я знаю, что при этом сам сопоставлял номера в Великобритании на более чем миллионе веб-сайтов: общее регулярное выражение для 10 или 11 цифр плюс некоторые другие основные правила соответствуют невероятному количеству не телефонных номеров.

Править: также, если вы сопоставляете данные с веб-документами, у вас также возникает проблема, когда номера телефонов не являются непрерывным свободным текстом, но содержат разметку html.Бывает :) 1007 *

1 голос
/ 11 марта 2011

^(?=(?:.*[^\\p{L}\\d]){8,})(?=(?:.*\\d){8,}) если не-буква не может быть цифрой

^(?=(?:.*\\P{L}){8,})(?=(?:.*\\d){8,}) если не-буква может быть цифрой

edit : закомментированный / исключить модификатор пробелов /x

если не буква не может быть цифрой

^                          # beginning of string
     (?=                         # Start look ahead assertion (consumes no characters)
          (?:                       # Start non-capture group
              .*                        # 0 or more anychar (will backtrack to match next char)
              [^\pL\d]                  # character: not a unicode letter nor a digit
          ){8,}                     # End group, do group 8 or more times
     )                           # End of look ahead assertion
     (?=                         # Start new look ahead (from beginning of string)
          (?:                        # Start grouping
              .*                         # 0 or more anychar (backtracks to match next char)
              \d                         # a digit
          ){8,}                      # End group, do 8 or more times (can be {8,}? to minimize match)
     )                           # End of look ahead

если не является буквой , может быть цифрой

^                       # Same form as above (except where noted)
    (?=                 #  ""
         (?:            #  ""
             .*         
             \PL        # character: not a unicode letter
         ){8,}
    )
    (?=
         (?:
             .*
             \d
         ){8,}
    )
0 голосов
/ 11 марта 2011

Как примерно так:

import java.util.regex.*;

class Test {
    public static void main(String args[]) {
        for (String tel : new String[]{
            "Tel: (011) 1234-1234 blah blah blah",
            "Tel: (011) 123-1 blah blah blah"
        }) {
            System.err.println(tel + " " + (test(tel) ?
                "matches" : "doesn't match"));
        }
    }

    public static boolean test(String tel) {
        return Pattern.compile("^(\\D*(\\d+?)\\D*){8,}$").matcher(tel).matches();
    }
}

даст:

Tel: (011) 1234-1234 blah blah blah matches
Tel: (011) 123-1 blah blah blah doesn't match
0 голосов
/ 11 марта 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...