2014-10-11 3 views
1

EDIT: Я бы также необходим, если это возможно, чтобы иметь регулярное выражение соответствует формату строкаJava согласовань группа захват

[id='value1' or id='value2' or ... or id='valueN'] 

, а также захватить все значения.

У меня есть код, который не работает, как я ожидал, и я не уверен, где моя ошибка. В принципе у меня есть строка, как

[id='id1' or id='id2' or id='id3'] 

и мне нужно найти все значения, такие как id1, id2 и id3.

final String regex = "\\[id='([^']+)'(?:\\s*or\\s*id='([^']+)')*\\]"; 
final String text = "[id='id1' or id='id2' or id='id3']"; 
final Pattern pattern = Pattern.compile(regex); 
final Matcher matcher = pattern.matcher(text); 

Если я

while(matcher.find()) 
{ 
    System.out.println(matcher.group(1)); 
} 

я только получаю

id1 

С

if (matcher.matches()) 
{ 
    System.out.println("Groups count: " + matcher.groupCount()); 
    for (int i = 1; i <= matcher.groupCount(); i++) 
    { 
     System.out.println(matcher.group(i)); 
    } 
} 

Я получаю

id1 
id3 

Ожидаемый результат будет

id1 
id2 
id3 

Ни выход ожидаемый один. Может ли кто-нибудь указать мне, является ли регулярное выражение неправильным или это связано с тем, что группа находила часть кода?

ответ

0

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

String s = "[id='id1' or id='id2' or id='id3']"; 
Pattern regex = Pattern.compile("(?<=id=')[^']+"); 
Matcher matcher = regex.matcher(s); 
while(matcher.find()){ 
     System.out.println(matcher.group(0)); 
} 

Выход:

id1 
id2 
id3 
+0

Привет и благодарю вас за ответ. Он работает, как вы упоминаете, но регулярное выражение не является достаточно ограничительным, чтобы соответствовать шаблону. Другие строки, такие как «[id = 'id1' и id = 'id2' и id = 'id3']", будут соответствовать регулярному выражению. Есть ли способ, чтобы и проверка, и захват имели только одно регулярное выражение? спасибо – user4132657

0

Javadoc из Matcher#find() состояний

Попытки найти следующую подпоследовательность входной последовательности, которая соответствует шаблону.

Если шаблон содержит несколько захваченных групп, вы сможете получить их все в одной и той же итерации find().

Таким образом, вы можете просто сделать это

while (matcher.find()) { 
    System.out.println("Groups count: " + matcher.groupCount()); 
    for (int i = 1; i <= matcher.groupCount(); i++) { 
     System.out.println(matcher.group(i)); 
    } 
} 

, который даст вам тот же результат, как и вашу попытку с Matcher#matches().

Почему нет, как выглядит id2?

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

Другие ответы предоставляют решения.