Java повторяющееся сопоставление с образцом - PullRequest
2 голосов
/ 14 июня 2011

Я пытаюсь получить каждое из повторяющихся совпадений простого регулярного выражения в Java:

(\\[[^\\[]*\\])*

, которая соответствует любой строке, заключенной в [], если только она не содержит символ [. Например, это будет соответствовать

[a][nice][repetitive][pattern]

Предварительно неизвестно, сколько таких групп существует, и я не могу найти способ доступа к отдельным группам соответствия с помощью сопоставления с образцом, то есть не могу получить

[a], [nice], [repetitive], [pattern]

(или, что еще лучше, текст без скобок), в 4 разных строках.

Используя pattern.matcher (), я всегда получаю последнюю группу.

Наверняка должен быть простой способ сделать это на Java, которого мне не хватает?

Спасибо за любую помощь.

Ответы [ 4 ]

5 голосов
/ 14 июня 2011
    String string = "[a][nice][repetitive][pattern]";
    String regexp = "\\[([^\\[]*)\\]";
    Pattern pattern = Pattern.compile(regexp);
    Matcher matcher = pattern.matcher(string);
    while (matcher.find()) {
        System.out.println(matcher.group(1));
    }
5 голосов
/ 14 июня 2011
while (matcher.find()) {
   System.out.println(matcher.group(1));
}

http://download.oracle.com/javase/6/docs/api/java/util/regex/Matcher.html#find%28%29

2 голосов
/ 14 июня 2011

Я бы использовал сплит

String string = "[a][nice][repetitive][pattern]";
String[] words = string.substring(1, string.length()-1).split("\\]\\[");
System.out.println(Arrays.toString(words));

отпечатки

[a, nice, repetitive, pattern]
1 голос
/ 14 июня 2011

Вот моя попытка:)

import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Foo {
    public static void main(String[] args) {
        final String text = "[a][nice][repetitive][pattern]";
        System.out.println(getStrings(text)); // Prints [a, nice, repetitive, pattern]
    }

    private static final Pattern pattern = Pattern.compile("\\[([^\\]]+)]");

    public static List<String> getStrings(final String text) {
        final List<String> strings = new ArrayList<String>();
        final Matcher matcher = pattern.matcher(text);
        while(matcher.find()) {
            strings.add(matcher.group(1));
        }
        return strings;
    }

}
...