Регулярное выражение:?: Нотация (знак вопроса и двоеточие)

У меня есть следующее регулярное выражение Java, которое я не писал, и я пытаюсь изменить:

^class-map(?:(\\s+match-all)|(\\s+match-any))?(\\s+[\\x21-\\x7e]{1,40})$
           ^                                 ^

Он похож на на этот.

Обратите внимание на первый вопросительный знак. Означает ли это, что группа не является обязательной? Значок вопроса после соответствующего ) уже есть. Имеет ли двоеточие особое значение в регулярном выражении?

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

Ответ 2

Немного поздно в эту ветку - просто чтобы построить ответ на Ryanp.

Предполагая, что у вас есть строка aaabbbccc

Регулярное выражение

(a)+(b)+(c)+

Это даст вам следующие 3 группы, которые соответствуют:

['a', 'b', 'c']

Регулярное выражение с не захватывающей скобкой

Используйте ?: в первой группе

(?:a)+(b)+(c)+

и вы получите следующие группы, которые соответствуют:

['b', 'c']

Следовательно, почему он называется " не захватывающей скобкой"

Пример использования:

Иногда вы используете скобки для других вещей. Например, чтобы установить границы | или оператора:

"New (York|Jersey)"

В этом случае вы используете только скобки для переключателя или |, и вы действительно не хотите захватывать эти данные. Используйте не захватывающие скобки, чтобы указать, что:

"New (?:York|Jersey)"