Java регулярное выражение для соответствия нечетному формату файла: {<< "user_1" >>, [<< "user_2" >>, << "user_3" >>, << "user_04" >>]} - PullRequest
0 голосов
/ 21 октября 2010

Это (неэкранированное) регулярное выражение, которое я использую до сих пор

\{<<"(\w+)">>, \[(<<"(\w+)">>,?)+\]\}.

Чтобы соответствовать этому:

{<<"user_1">>, [<<"user_2">>,<<"user_3">>,<<"user_04">>]}.

И вот эти группы я получаю:

1: user_1
2: <<"user_04">>
3: user_04

Есть какие-нибудь мысли о том, почему это не дает нескольким пользователям?

Если вам интересно, формат файла основан на эрланге.

Ответы [ 2 ]

2 голосов
/ 21 октября 2010

Количество групп шаблона установлено на 3. Группы захватывают текст в последнем месте, где они совпадают.Последние две (вложенные) группы совпадают три раза, чтобы использовать входные данные;вы видите, где они в последний раз совпадали с четвертым пользователем.

Что вы пытаетесь здесь сделать?Если вы хотите просто сопоставить содержимое разделителей << / >>, вы можете попробовать что-то вроде:

String text = "{<<\"user_1\">>, [<<\"user_2\">>,<<\"user_3\">>,<<\"user_04\">>]}";
String regex = "<<\"(\\w+)\">>";
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(text);
while (m.find()) {
  System.out.format("found: %s\n", m.group(1));
}

Это приведет к выводу:

found: user_1
found: user_2
found: user_3
found: user_04
0 голосов
/ 21 октября 2010

Я не мог заставить регулярное выражение работать так, как хотел ОП, поэтому я предлагаю эту прекрасную вещь.

String in =  "{<<\"user_1\">>, [<<\"user_2\">>,<<\"user_3\">>,<<\"user_04\">>]}";
List<String> list = new ArrayList<String>();

list.addAll(Arrays.asList(in.replaceAll("[\\s\\{\\}\\[\\[\\]<>\"]", "").split(",")));

for (String s : list) {
    System.out.println(s);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...