Регулярное выражение: вопросительный знак и двоеточие [дубликат]


этот вопрос уже есть ответ здесь:

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

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

Это похоже на этот.

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

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

2 75

2 ответа:

(?: запускает группу без захвата. Это ничем не отличается от ( Если вы не извлекаете группы из регулярного выражения после использования. Смотрите что такое группа без захвата? Что означает вопросительный знак двоеточие (?:) значит?.

немного поздно для этой темы-просто чтобы опираться на ответ ryanp.

если у вас есть строка aaabbbccc

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

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

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

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

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

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

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

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

['b', 'c']

поэтому он и называется"незахватывающие скобочки"

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

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

"New (York|Jersey)"

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

"New (?:York|Jersey)"