2013-12-12 3 views
1

Я определяю выражение java для своего шаблона, но оно не работает.Явное выражение для встроенного параметра

Вот текст, который я хочу, чтобы определить шаблон для:

"sometext {10} some text {25} sometext". 

Именованные параметры {10}, {25}, ....

Я использовал шаблон, как это: «({\ d +}) * "но это не работает, и я получил исключение:

Caused by: java.util.regex.PatternSyntaxException: Illegal repetition near index 0 
({\d+})* 

Вот код, у меня есть:

public static final Pattern pattern = Pattern.compile("({\\d+})*"); 
public static void main(String[] args) { 
    String s = "{10}ABC{2}"; 
    Matcher matcher = pattern .matcher(s); 
    while (matcher.find()) { 
       System.out.println(matcher.group(1)); 
    } 
} 

Может кто-нибудь объяснить, что я здесь не так? Благодарю.

ответ

2

Есть несколько проблем с вашим Pattern.

  • Во-первых, вам не нужны внешние скобки, поскольку вы не определяете групповое сохранение из основной группы.
  • Во-вторых, вы должны избегать фигурных скобок (\\{), иначе они будут интерпретироваться как квантификатор.
  • В-третьих вам не нужна последняя квантор (*), так как вы итерация матчей в тот же вход String

Так что ваши Pattern будет выглядеть как "\\{\\d+\\}".

Дополнительная информация о Java Pattern s here.

Edit - пример

String input = "sometext {10} some text {25} sometext"; 
Pattern p = Pattern.compile("\\{\\d+\\}"); 
Matcher m = p.matcher(input); 
while (m.find()) { 
    System.out.println(m.group()); 
} 

Выход:

{10} 
{25} 
+0

Я использовал «\\ {\\ d + \\}», но это не сработало. Можете ли вы показать мне образец? –

+0

@Luu см. Мое редактирование. Если вы удалите скобку, вы не можете ссылаться на группу 1, только ссылочную группу 0 на метод 'Matcher.group()'. – Mena

+0

Теперь он работает. Если я использовал m.group (1), он выдает исключение, но если group(), он работает. Благодарю. Я принимаю ваше решение. –

2

{ является специальным символом в регулярном выражении, только дважды сбегите от него \\{. То же самое для }.

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

+0

закрывающая фигурная скобка не нужно экранировать. –

+0

@CasimiretHippolyte Возможно, нет, но это будет путать, по крайней мере, для меня. – m0skit0

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