2013-09-06 1 views
1

Там в электронной схеме:

^[a-zA-Z0-9][\w.-]*[a-zA-Z0-9]@[a-zA-Z0-9][\w.-]*[a-zA-Z0-9]\.[a-zA-Z][a-zA-Z.]*[a-zA-Z]$

и пример кода, которые пытаются получить электронную почту из строки:

String email = "NAME <[email protected]>"; 

Pattern pattern = Pattern.compile(EMAIL_PATTERN); 
Matcher matcher = pattern.matcher(email); 

if (matcher.find()) { 
    System.out.println(matcher.group()); 
} 

Когда регулярное выражение содержит ^ и $ символов, matcher.find() возвращает false, но когда regexp без этих символов, все в порядке: я вижу [email protected] в консоли.

Не могли бы вы объяснить разницу между регулярным выражением с и без ^ и $?

Как заставить Матчи работать с регулярным выражением, которое содержит ^ и $?

+2

Пожалуйста Google "регулярки якорь". – sp00m

ответ

1

^ & $ соответствует началу и концу строки (строка или полный текст, если включен переключатель MultiLine). Вы можете обрезать их из шаблона, если вам нужно извлечь электронную почту из текста.

String EMAIL_PATTERN = "^[a-zA-Z0-9][\\w.-]*[a-zA-Z0-9]@[a-zA-Z0-9][\\w.-]*[a-zA-Z0-9]\\.[a-zA-Z][a-zA-Z.]*[a-zA-Z]$"; 
    String email = "NAME <[email protected]>"; 
    Pattern pattern = Pattern.compile(EMAIL_PATTERN.substring(1, EMAIL_PATTERN.length()-1)); 
    Matcher matcher = pattern.matcher(email); 

    if (matcher.find()) { 
     System.out.println(matcher.group()); 
    } 

Выход

[email protected] 
1

^ и $ среднее начало и конец ввода, соответственно. "NAME <...>", окружающий адрес, вызывает ошибку Matcher, чтобы игнорировать потенциальное совпадение, которое могло бы найти это не для ^ и $.

+0

ладно, спасибо! есть ли возможность в Matcher или в классах шаблонов игнорировать эти привязки? –

+0

@ hard-code Конечно. Удалите их из шаблона, и Matcher проигнорирует их. – Holger

+0

Нет, они этого не делают. Они означают начало и конец ** строки ** (или до окончания строки в конце строки), соответственно. Они означают только начало/конец ** линии **, если установлен флаг 'MULTILINE' /' (? M) '. См. ['Pattern MULTILINE'] (http://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html#MULTILINE) (Это верно в большинстве вариантов регулярных выражений, при этом Ruby исключение.) – Qtax

 Смежные вопросы

  • Нет связанных вопросов^_^