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