Як я можу сказати RegEx (.NET версія) отримати найменший дійсний збіг замість найбільшого?
Як я можу сказати RegEx (.NET версія) отримати найменший дійсний збіг замість найбільшого?
Відповіді:
Для регулярного виразу на зразок .*
або .+
додайте знак питання ( .*?
або .+?
), щоб відповідати якомога меншій кількості символів. Щоб необов’язково відповідати розділу, (?:blah)?
але без відповідності, якщо це абсолютно не потрібно, використовуйте щось подібне (?:blah){0,1}?
. Для повторюваного збігу (з використанням {n,}
або {n,m}
синтаксисом) додайте знак питання, щоб спробувати зіставити якомога менше (наприклад, {3,}?
або {5,7}?
).
Документація щодо кількісних кількісних показників виразів також може бути корисною.
Нежадібним оператора, ?
. Так:
.*?
Не жадібний оператор не означає найкоротший можливий збіг:
abcabk
a.+?k
відповідатиме всій рядку (у цьому прикладі) замість лише трьох останніх знаків.
Я хотів би фактично знайти найменший можливий збіг замість цього.
Це останній можливий матч для " a
", щоб все-таки дозволити всі матчі k
.
Я думаю, єдиний спосіб зробити це - використовувати такий вираз:
a[^a]+?k
cab
. Якщо мій внесок є, caaacab
і я шукаю a.*?b
його, він поверне повний рядок замість короткого збігу всередині. Як би я шукав назад із b
?
START[^START]*?END
(де START і END - це ваші регулярні вирази символів початку і кінця). По суті, це означає "
abcabk
іa.+?k
, RegEx буде відповідати цілому рядку.