2015-11-16 3 views
2

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

..some_text0 [[some_text1]] some_text2 [[some_text3]] some_text4 ....

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

some_text1 
some_text3 

Я попытался это решение:

Matcher m = Pattern.compile("\\[\\[.*\\]\\]").matcher(line_input); 

while (m.find()) { 

    System.out.println("Found: " + matcher.group()); 

} 

но это отпечатает меня:

[[some_text1]] some_text2 [[some_text3]] 

как только результат. Как достичь моей цели?

+1

Группы матч ничего. –

+1

'' \\ [\\ [. *? \\] \\] "' –

+0

@PranavCBalan ваше решение работает, если вы дадите мне объяснение в качестве ответа aerea. Я пометю ваш ответ. – Leonardo

ответ

1

Регулярное выражение для решения этой задачи, как показано ниже

\[\[(.*?)]] 

Он ищет [[ следует любой строка, которая закрывает с ]]

Вот DEMO и explanation

+1

Обратите внимание, что вам не нужно скрывать ']' внешние классы символов. Кроме того, это регулярное выражение '\ [\ [([^ \]] +) \] \]' не будет соответствовать '[[text = [placeholder] _test]]', [mine will] (https: // regex101. com/r/pG1nZ4/5), поскольку он в основном работает как '. *?'. –

+1

Это было вне рамок, чего хотел OP, но он включен после небольшой коррекции. – MaxZoom

1

Использование \[\[.*?]] регулярное выражение, которое просто медленно, и . по умолчанию не соответствует новой строке, вы можете столкнуться с проблемой, когда предел возврата назад исчерпан, если вы разбираете очень длинные строки.

я предлагаю использовать регулярное выражение, основанное на методе разворачивания-The-петле:

\[{2}([^\]]*(?:\](?!\])[^\]]*)*)\]{2} 

Или даже более короткого

\[{2}([^\]]*(?:\][^\]]+)*)\]{2} 

См regex demo 1 и demo 2.

Вот Java demo:

String str = "some_text0 [[some_text1]] some_text2 [[some_text3]] some_text4"; 
Pattern ptrn = Pattern.compile("\\[{2}([^\\]]*(?:\\][^\\]]+)*)\\]{2}"); 
Matcher matcher = ptrn.matcher(str); 
while (matcher.find()) { 
    System.out.println(matcher.group(1)); 
} 

Результат:

some_text1 
some_text3 

Regex пробоя:

  • \[{2} - соответствуют ровно 2 [ символы
  • [^\]]* - матч 0 или больше, чем другие ]
  • (?:\][^\]]+)* символы - соответствует 0 или более последовательностей ...
    • \] - один ] которым следует
    • [^\]]+ - 1 или более символов, отличных от ]
  • \]{2} - соответствует точно 2 ] символы.

Отличие от регулярного выражения .*? состоит в том, что совпадение становится более линейным и, следовательно, шаблон регулярного выражения намного быстрее и меньше подвержен ошибкам.

+0

Ваше регулярное выражение также соответствует пустым скобкам типа '[[]]' – MaxZoom

+0

Да, он встроен в '' \\ [\\ [. * \\] \\] "' и '" \\ [\\ [. * ? \\] \\] ", который работает для OP. –

+0

@MaxZoom: Не проблема, используйте группу 1. –

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