2013-05-29 4 views
2

Я пишу часть программы для извлечения содержимого из строки между «:» (может и не иметь) и «@» и гарантией заказа, например строку типа «url: 123 @ my. com ", я получаю« 123 »или« [email protected] », затем я получаю« 123 »; поэтому я пишу регулярное выражение для реализации этого, но я не могу работать, за это первая версия:странный регулярный взгляд позади

Pattern pattern = Pattern.compile("(?<=:?).*?([email protected])"); 
Matcher matcher = pattern.matcher("sip:[email protected]"); 
if (matcher.find()) { 
    Log.d("regex", matcher.group()); 
} else { 
    Log.d("regex", "not match"); 
} 

он не может работать, так как в первом случае: «URL: [email protected]» он получит результат: «URL: 123» явно не то, что я хочу:

так я пишу вторую версию:

Pattern pattern = Pattern.compile("(?<=:??).*?([email protected])"); 

но получаю ошибку, кто-то сказал, Java не поддерживает переменную длину в вид сзади;

поэтому я стараюсь третий вариант:

Pattern pattern = Pattern.compile("(?<=:).*?([email protected])|.*?([email protected])"); 

и его результат такой же, как первый вариант, НО НЕ ДОЛЖЕН ПЕРВЫЙ УСЛОВИЕ СЧИТАТЬ ПЕРВЫЙ?

он такой же, как

Pattern pattern = Pattern.compile(".*?([email protected])|(?<=:).*?([email protected])"); 

не слева направо! Я считаю, что раньше я понимал регулярное выражение, но снова путал.

ответ

1

Попробуйте это (немного отредактирован см комментарии):

String test = "sip:[email protected]"; 
String test2 = "[email protected]"; 
Pattern pattern = Pattern.compile("(.+?:)?(.+?)([email protected])"); 
Matcher matcher = pattern.matcher(test); 
if (matcher.find()) { 
    System.out.println(matcher.group(2)); 
} 
matcher = pattern.matcher(test2); 
if (matcher.find()) { 
    System.out.println(matcher.group(2)); 
} 

Выход:

+8610086 
8610086 

Позвольте мне знать, если вам нужны разъяснения по шаблону.

+0

он работает хорошо ! Большое вам спасибо! Я меняю его на Pattern pattern = Pattern.compile ("(. +? :) ? (.? +) (? = @) "); и хорошо работать. –

+0

Добро пожаловать. И да, вы меняете смысл: \\ +?часть бесполезна, если не следовать чем-то более конкретным, чем. +? (например, \\ d +?). – Mena

0

Как вы сказали, вы не можете выполнять переменную lookbehind в java.

Затем вы можете сделать что-то вроде этого, вам не понадобятся lookbehind или lookaround.

Regex: :?([^@:]*)@

Example В этом примере (забудьте о \ п, его из-за regex101) вы получите в первой группе, что вам нужно, и вы не должны делать ничего особенного. Иногда самое простое решение - лучшее.

+0

кажется разумным, но я проверяю его, и он терпит неудачу, я добавляю вам регулярное выражение в свой шаблон, но:? часть кажется не эффект вообще, я смущен, тоже. спасибо в любом случае. –

0

Вам действительно не нужны какие-либо взгляды или взгляды. Что вам нужно, может быть достигнуто с помощью аа жадного quantifer и некоторое чередование:

.*(?:^|:)([^@]+) 

По ява умолчанию регулярных выражений кванторов (*+{n}?) все жадные (будет соответствовать стольких символам, сколько возможно, пока матч не может быть найден . Они могут быть ленивые, используя знак вопроса после квантора, как так:. .*?

Вы хотите вывести группу захвата 1 для этого выражения, выводя группу захвата 0 вернет весь матч

+0

Я экзамен, не работает хорошо. . * (?:^| :) часть не работает хорошо в моем шаблоне. В любом случае. –

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