Как заставить регулярное выражение соответствовать самой длинной части шаблона.
У меня есть шаблон в.net, и я хочу, чтобы строка соответствовала максимально длинной части шаблона
Pattern : "I (?<a>[\w\W]*)(want to match (?<b>longest))? available"
or "I ((?<a>[\w\W]*)|(want to match (?<b>longest))?)+ available"
Строка: "Я хочу соответствовать самой длинной из доступных"
после матча имеем: a = "хотите найти самый длинный", b=""
но я хочу: a = "", b = "самый длинный"
1 ответ
По умолчанию RegEx является "жадным", что означает, что он будет максимально соответствовать. Чтобы сделать повторение ленивым, добавьте ?
,
I <?a:[\w\W]*?>(want to match <?b:longest>)? available
^
Теперь это будет соответствовать 0+ [\w\W]
символы лениво, или другими словами: до тех пор, пока выражение не может продолжать совпадать (как только оно видит want to match longest available
, так далее).
Примеры: жадность против ленивых (нажмите "отладчик регулярных выражений", чтобы увидеть, как работает каждое из этих повторений).
То же самое относится и к вашему другому выражению, однако жадность - это проблема в другом месте:
I ((?<a>[\w\W]*)|(want to match (?<b>longest))?)+? available
^