Регулярное выражение: вопросительный знак и двоеточие [дубликат]
этот вопрос уже есть ответ здесь:
у меня есть следующее регулярное выражение 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)"
в этом случае вы используете только скобки для or
|
переключатель, и вы действительно не хотите, чтобы захватить эти данные. Используйте скобку без захвата, чтобы указать, что:"New (?:York|Jersey)"