Как заставить регулярное выражение соответствовать самой длинной части шаблона.

У меня есть шаблон в.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
                                                 ^
Другие вопросы по тегам