Я пишу часть программы для извлечения содержимого из строки между «:» (может и не иметь) и «@» и гарантией заказа, например строку типа «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])");
не слева направо! Я считаю, что раньше я понимал регулярное выражение, но снова путал.
он работает хорошо ! Большое вам спасибо! Я меняю его на Pattern pattern = Pattern.compile ("(. +? :) ? (.? +) (? = @) "); и хорошо работать. –
Добро пожаловать. И да, вы меняете смысл: \\ +?часть бесполезна, если не следовать чем-то более конкретным, чем. +? (например, \\ d +?). – Mena