2

Мне нужно разобрать строку , которая выглядит следующим образом : A Christmas Special - Special of the day в 3 -х или 4 - отличительные группы в зависимости от того, если - символ присутствует в исходной строке или не нравится , например:

(Рождественское специальное предложение) (-) (Специальное предложение) (дня), если присутствовал символ -.

или же

(Рождественское специальное предложение) (Специальное предложение) (дня), если - символ не присутствовал.

Шаблон RegEx, который я пытаюсь использовать в строке, выглядит следующим образом: ^(.+?)( - )?(Special)(.*)

Что переводится как:

Group1 = соответствует любому символу (кроме новой строки) от одного до неограниченного количества раз, как можно меньше раз, расширяясь по мере необходимости [ленивый]

Group2 = соответствует - буквальном смысле. От нуля до одного раза, столько раз, сколько возможно, отдача по мере необходимости [жадный]

Group3: буквально соответствует персонажам Special

Group4: соответствует любому символу (кроме новой строки) от нуля до неограниченного количества раз, столько раз, сколько возможно, возвращая при необходимости [жадный]

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

(Рождество) (Специальное) (- Специальное предложение дня), если присутствовал символ -.

или же

(Рождество) (Специальное) (Специальное предложение дня), если - символ не присутствовал.

Что не соответствует ни одному из шаблонов группировки, которые я пытаюсь получить из строки, поэтому вопрос очевиден.

Как я могу изменить шаблон регулярного выражения, чтобы он не рассматривал первое вхождение слова Special как свою собственную уникальную группу, а вместо этого делал второе вхождение уникальным, чтобы я мог получить ожидаемую группу?

2 ответа2

0

По умолчанию Regex является жадным и останавливается на первом совпадении. Чтобы сделать матч ленивым, вы можете использовать? символ после поискового запроса. Например,

[.+] жадный, но [.+?] ленивый

Этот сайт является фантастическим хранилищем информации регулярных выражений.

http://www.regular-expressions.info/

-1

Попробуйте с этим:

^([^-]+[^-\s])\s?( - )?(Special)\s?(.*)

([^-]+[^-\s]) : соответствует любой строке, которая не содержит «-», и не завершается в пробеле.

\s?( - )? : Соответствует пробелу или '-'

(Special)\s?(.*) : Соответствует 'Special + пробел (необязательно) + any_string'

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .