Регулярное выражение:?: Нотация (знак вопроса и двоеточие)
У меня есть следующее регулярное выражение Java, которое я не писал, и я пытаюсь изменить:
^class-map(?:(\\s+match-all)|(\\s+match-any))?(\\s+[\\x21-\\x7e]{1,40})$
^ ^
Он похож на на этот.
Обратите внимание на первый вопросительный знак. Означает ли это, что группа не является обязательной? Значок вопроса после соответствующего )
уже есть. Имеет ли двоеточие особое значение в регулярном выражении?
Регулярное компилирование отлично, и уже есть тесты JUnit, которые показывают, как это работает. Просто я немного смущен тем, почему есть первый знак вопроса и двоеточие.
Ответы
Ответ 1
(?:
запускает группу, не связанную с захватом. Это не отличается от (
, если вы не извлекаете группы из регулярного выражения после использования. См. Что такое группа, не связанная с захватом? Что означает знак вопроса, за которым следует двоеточие (?:) означает?.
Ответ 2
Немного поздно в эту ветку - просто чтобы построить ответ на Ryanp.
Предполагая, что у вас есть строка aaabbbccc
Регулярное выражение
(a)+(b)+(c)+
Это даст вам следующие 3 группы, которые соответствуют:
['a', 'b', 'c']
Регулярное выражение с не захватывающей скобкой
Используйте ?:
в первой группе
(?:a)+(b)+(c)+
и вы получите следующие группы, которые соответствуют:
['b', 'c']
Следовательно, почему он называется " не захватывающей скобкой"
Пример использования:
Иногда вы используете скобки для других вещей. Например, чтобы установить границы |
или оператора:
"New (York|Jersey)"
В этом случае вы используете только скобки для переключателя или |
, и вы действительно не хотите захватывать эти данные. Используйте не захватывающие скобки, чтобы указать, что:
"New (?:York|Jersey)"