Неохотный квантификатор, действующий жадный
У меня есть этот код:
String result = text;
String regex = "((\\(|\\[)(.+)(\\)|\\])){1}?";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(result);
System.out.println("start");
System.out.println(result);
while (matcher.find()) {
System.out.print("Start index: " + matcher.start());
System.out.print(" End index: " + matcher.end() + " ");
System.out.println(matcher.group());
}
System.out.println("finish");
И у меня есть строка, которую я хочу сопоставить:
Some text sentence or sentences [something 234] (some things)
И вывод я получаю при выполнении:
start
some text sentence or sentences [something 234] (some things)
Start index: 32 End index: 61 [something 234] (some things)
finish
Теперь я на самом деле хочу найти найденные случаи в скобках отдельно, поэтому найти: [что-то 234] в одном совпадении (некоторые вещи) в качестве второго совпадения
Может кто-нибудь, пожалуйста, помогите мне построить регулярное выражение соответственно? Я не уверен, как поставить неохотный квантификатор для всего регулярного выражения, поэтому я заключил все элементы в квадратные скобки в другие скобки. Но я не понимаю, почему этот неохотный квантификатор действует здесь жадно и что мне нужно сделать, чтобы это изменить?
1 ответ
{1}
в регулярных выражениях является избыточным, поскольку любой элемент без указанного квантификатора должен быть найден один раз. Кроме того, отказываться от него не имеет смысла, поскольку он не описывает диапазон возможных повторений (например, {min,max}
где добавление ?
сказал бы, чтобы двигатель регулярных выражений сделал число повторений в этом диапазоне как можно ближе к min
насколько это возможно). Вот {n}
описывает точное количество повторений так min
знак равно max
знак равно n
,
Теперь вы должны быть в состоянии решить вашу проблему, сделав .+
(содержание в скобках) неохотно. Для этого используйте .+?
,
Так что попробуйте с:
String regex = "((\\(|\\[)(.+?)(\\)|\\]))";