2016-11-18 3 views
-2

У меня есть следующее регулярное выражение:Почему это регулярное выражение не соответствует URL-адресам?

^(?=\w+)(-\w+)(?!\.) 

Что я пытающийся матч против следующего текста:

www-test1.examples.com 

Регулярное выражение должно соответствовать только -test1 часть строки, и только если до первого . и после начала выражения. www может быть любой строкой, но ее не следует сопоставлять.

Мой рисунок не соответствует -test1. Что мне не хватает?

+0

Эти пространства присутствуют в вашем текущем регулярном выражении? Знаете ли вы, как выглядят взгляды? Какой язык/инструмент вы используете? –

+0

Извините, удалили их сейчас. Почему нисходящий? – genonymous

+0

Если 'www' может быть любой строкой, то я не уверен, что это требование для текста, который должен быть до матча, но не должен совпадать. – funkwurm

ответ

2

Java является одним из немногих языков, которые поддерживают не фиксированную длину просмотровые задом (который в основном означает, что вы можете использовать квантификаторы), поэтому вы можете технически использовать следующее:

(?<=^\w+)(-\w+)

Это будет соответствовать -test, не захватывая предыдущие вещи. Однако, как правило, не рекомендуется использовать внешний вид с нефиксированной длиной, поскольку они не идеальны и не являются очень эффективными и не переносятся на других языках. Сказав это, это простой шаблон, поэтому, если вы не заботитесь о переносимости, обязательно, подойдите к нему.

Лучшее решение, хотя это группы, что вы хотите захватить, и ссылаться на захваченную группу (в данном случае, группа 1):

^\w+(-\w+)

P.S. - \w не будет соответствовать точке, поэтому нет необходимости смотреть в будущее.

p.p.s. - ответить на ваш вопрос о том, почему ваш оригинальный шаблон ^(?=\w+)(-\w+)(?!\.) не соответствует. Есть две причины:

1) вы начинаете с начала утверждения строки, а затем используете lookahead, чтобы узнать, следует ли, что следует, это один или несколько символов слова. Но lookaheads - утверждения с нулевой шириной, что означает, что никакие символы фактически не потребляются в матче, поэтому указатель не переходит вперед к следующим символам после матча. Таким образом, он видит, что «www» соответствует ему и переходит к следующей части шаблона, но фактический указатель не прошел мимо начала строки. Таким образом, он затем пытается соответствовать вашей части (-\w+). Ну, ваша строка не начинается с «-», поэтому шаблон выходит из строя.

2) (?!\.) является негативным взглядом.Ну, ваша примерная строка показывает точку, как самую следующую вещь после вашей части «-test». Так что даже если № 1 не подведет, это не поможет.

+0

Спасибо, кучка. Первое регулярное выражение, которое вы упомянули в своем ответе, было тем, что я искал. Я ценю подробные предостережения, которые вы упомянули. Как насчет более строгой версии регулярного выражения, где '-test2' ожидает, что за ним последует' .'? '(? <=^\ w +) (- \ w +) (? = \.)' – genonymous

+1

@genonymous Это зависит от вас. То, что я разместил, будет соответствовать, например, 'www-test1-foo.examples.com', который является допустимым (под) доменом. Но если вы хотите более строго ожидать ничего после '- \ w', тогда обязательно добавьте' (? = \.) ' –

1

Проблема, с которой вы сталкиваетесь, - это взгляд. В этом случае неуместно, если вы хотите захватить то, что находится между - и первым .. Образец, который вы хотите, выглядит примерно так:

(-\w+)(?=\.) 

В этом случае содержимое группы захвата 1 будет содержать нужный текст.

Demo on Regex101

+0

Спасибо за ваш ответ, но я не хочу, чтобы www и dot (.) Соответствовали друг другу. Вот почему я использовал взгляды. Теперь, когда я больше думаю об этом, регулярное выражение в исходном вопросе должно было бы выглядеть как '^ (? = \ W +) (- \ w +) (? <= \.)' С положительным взглядом вперед и положительным взглядом. Но этот тоже не работает. – genonymous

+0

@genonymous Lookbehind должен быть слева, взгляд должен быть справа. – Barmar

+0

@genonymous: есть ли определенная проблема с совпадением 'www', но не с его захватом? Потому что, вообще говоря, у вас не может быть произвольной длины, как вам кажется. –

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