Как я могу сопоставить повторяющийся шаблон с регулярными выражениями Java? - PullRequest
4 голосов
/ 02 апреля 2009

С учетом следующей входной строки 3481.7.1071.html

Я хочу подтвердить, что

  1. В строке есть 1 или более чисел, за которыми следует точка.
  2. Строка заканчивается на html .

Наконец, я хочу извлечь крайнее левое число (т.е. 3481).

Мое текущее регулярное выражение уже близко, но я не могу захватить правильную группу:

final Pattern p = Pattern.compile("(\\d++\\.)+html");   
final Matcher m = p.matcher("3481.7.1071.html");
if (m.matches()) {
    final String corrected = m.group(1)+"html"; // WRONG! Gives 1071.html
}

Как мне записать первый матч?

Ответы [ 6 ]

7 голосов
/ 02 апреля 2009

Вы можете просто выделить это:

(\d+\.)(\d+\.)*html
3 голосов
/ 02 апреля 2009
"^(\\d+)\\.(\\d+\\.)*html$"
0 голосов
/ 31 августа 2012

Да, вы можете.

Если 123.html и 1.23html и являются действительными , , используйте :

^(?:(\d+)\.).*?html$

Если 123.html является недействительным , но 1.23html действительным , используйте это :

^(?:(\d+)\.(?!h)).*?html$

Если 123.html и 1.23html являются недействительными , но только 1.23.html действительными , используйте это :

^(?:(\d+)\.).*?\.html$
0 голосов
/ 31 августа 2012
groovy:000> p = java.util.regex.Pattern.compile("(\\d+).*") 
===> (\d+).*
groovy:000> m = p.matcher("3481.7.1071.html")
===> java.util.regex.Matcher[pattern=(\d+).* region=0,16 lastmatch=]
groovy:000> m.find()
===> true
groovy:000> m.group(1)+".html"
===> 3481.html
groovy:000> 
0 голосов
/ 02 апреля 2009

стиль Java: "(\\d+)\\..*?\\.html$"

Это будет 1) захватить первую группу последовательных цифр, 2) потребовать точку после слов, 3) перепрыгнуть через все, кроме 3) буквенную строку «.html»

Если вы имеете в виду «одну или несколько [ групп ] чисел, за которыми следует точка», то это больше соответствует вашим требованиям.

"(\\d+)(?:\\.\\d+)*\\.html$"

Таким образом, вы получите число , а не точку. И ни один из других шаблонов не должен быть захвачен, так что это не так.

0 голосов
/ 02 апреля 2009

Решение jpalecek не удается; он захватывает самый правый номер. Оригинальный постер был намного ближе, но он получил самый правый номер. Чтобы получить крайнее левое число, игнорируйте что-либо после первой точки:

[^\d]*(\d+)\..*html

[^ \ d] * игнорирует все до крайнего левого числа (поэтому X1.html захватывает номер 1) (\ D +). фиксирует первые цифры, если за ними следует точка. . * игнорирует все, что находится между точкой и окончательным html.

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