Что не так с этим регулярным выражением? - PullRequest
3 голосов
/ 05 ноября 2010

Я пытаюсь следующий код на Java:

String test = "http://asda.aasd.sd.google.com/asdasdawrqwfqwfqwfqwf";
String regex = "[http://]{0,1}([a-zA-Z]*.)*\\.google\\.com/[-a-zA-Z/_.?&=]*";
System.out.println(test.matches(regex));

Он работает в течение нескольких минут (после этого я убил ВМ) безрезультатно. Кто-нибудь может мне помочь?

Кстати: что вы порекомендуете мне сделать, чтобы ускорить регулярные выражения weblink-testng в будущем?

Ответы [ 6 ]

7 голосов
/ 05 ноября 2010

[http://] - это класс символов, то есть любой один из этих символов из набора.

Просто оставьте эти квадратные скобки выключенными, если они должны начинатьсяс http://.Если это необязательно, вы можете использовать (http://)?.

Одна очевидная проблема заключается в том, что вы ищете последовательность ([a-zA-Z]+.)*\\.google - это приведет к лоту возврата из-за этого голого., что означает «любой символ», а не буквальный период, который вы хотели.

Но даже если вы замените его на то, что вы имели в виду , ([a-zA-Z]+\\.)*\\.google, у вас все еще есть проблема- для этого потребуется два . символа непосредственно перед google.Вместо этого вы должны попробовать:

String regex = "(http://)?([a-zA-Z]+\\.)*google\\.com/[-a-zA-Z/_.?&=]*";

, который немедленно возвращается для меня с совпадением true.

Имейте в виду, что в настоящее время для этого требуется / в конце google.com,Если это проблема, то это мелкое исправление, но я оставил его там, поскольку оно было у вас в исходном регулярном выражении.

4 голосов
/ 05 ноября 2010

Вы пытаетесь сопоставить схему как класс персонажа, используя квадратные скобки.Это означает только ноль или один из символов из этого набора.Вы хотите подшаблон с круглыми скобками.Вы также можете изменить {0,1}, чтобы просто сказать ?.

Кроме того, вы должны удалить период непосредственно перед google\\.com, потому что вы уже ищете точку в поддомене своего домена регулярного выражения.Как указывает черувим, вы также забыли об этом периоде.

String regex = "(http://)?([a-zA-Z]+\\.)*google\\.com/[-a-zA-Z/_.?&=]*";
3 голосов
/ 05 ноября 2010

В части ([a-zA-Z]*.) вам нужно либо экранировать . (потому что сейчас это означает "все символы"), либо удалить его.

2 голосов
/ 05 ноября 2010

Есть две проблемы с регулярным выражением.

Первое легко, как упоминалось другими. Вам необходимо сопоставить "http://" как подшаблон, а не класс символов. Измените скобки на круглые скобки.

Вторая проблема вызывает очень плохую производительность. Это заставляет регулярное выражение многократно возвращаться назад, пытаясь сопоставить шаблон.

То, что вы пытаетесь сделать, это сопоставить ноль или более поддоменов, которые представляют собой группы букв, за которыми следует точка. Поскольку вы хотите явно сопоставить точку, избегайте ее. Также удалите точку перед "Google", чтобы вы могли сопоставить "http://google.com/etc" (т. Е. Нет ведущей точки перед Google).

Итак, ваше выражение становится:

String regex = "(http://){0,1}([a-zA-Z]+\\.)*google\\.com/[-a-zA-Z/_.?&=]*";

Выполнение этого регулярного выражения в вашем примере занимает доли секунды.

1 голос
/ 05 ноября 2010

Группируя часть перед google.com Я предполагаю, что вы ищете часть имени хоста URL.Я думаю, что rexep - это мощный инструмент, но вы можете просто использовать URL-класс Java .Есть метод getHost().Затем вы можете проверить, заканчивается ли имя хоста google.com и разбить его, или использовать более простое регулярное выражение только с именем хоста.

1 голос
/ 05 ноября 2010

Если вы исправите ([a-zA-Z]*\\.), вам нужно изменить * на +, чтобы деталь стала ([a-zA-Z]+\\.).В противном случае вы принимаете http://...google.com, и это недействительно.

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