RegEx: найменший можливий матч або нереєстровий збіг


Відповіді:


192

Для регулярного виразу на зразок .*або .+додайте знак питання ( .*?або .+?), щоб відповідати якомога меншій кількості символів. Щоб необов’язково відповідати розділу, (?:blah)?але без відповідності, якщо це абсолютно не потрібно, використовуйте щось подібне (?:blah){0,1}?. Для повторюваного збігу (з використанням {n,}або {n,m}синтаксисом) додайте знак питання, щоб спробувати зіставити якомога менше (наприклад, {3,}?або {5,7}?).

Документація щодо кількісних кількісних показників виразів також може бути корисною.


7
Я не знаю, чи я єдиний із цим непорозумінням, але важливо зазначити: Хоча це правда, що не жадібний оператор відповідатиме якомога менше символів, він все ще може бути не відповідним, який шукає. для. "Якнайменше символів" не відповідає "найкоротшому можливому збігу" щодо стандартів RegEx. Дивіться відповідь нижче мого коментаря: За допомогою abcabkі a.+?k, RegEx буде відповідати цілому рядку.
тонконіг

Рядок2 ", але без відповідності, якщо абсолютно не потрібно": Що це означає?
Дощ


45

Не жадібний оператор не означає найкоротший можливий збіг:

abcabk

a.+?k відповідатиме всій рядку (у цьому прикладі) замість лише трьох останніх знаків.

Я хотів би фактично знайти найменший можливий збіг замість цього.

Це останній можливий матч для " a", щоб все-таки дозволити всі матчі k.

Я думаю, єдиний спосіб зробити це - використовувати такий вираз:

a[^a]+?k


2
Або шукайте в зворотному порядку, починаючи з кінця, коли вкладені збіги: "(ab (abk) bk)".
LBogaardt

7
@LBogaardt як би здійснити пошук у зворотному порядку? не зрозумійте
azerafati

2
@LBogaardt Все ще відкрите питання: як шукати в зворотному порядку? Скажімо, я хочу отримати cab. Якщо мій внесок є, caaacabі я шукаю a.*?bйого, він поверне повний рядок замість короткого збігу всередині. Як би я шукав назад із b?
C4d

3
Переверніть рядок, а потім застосуйте регулярний вираз.
Джонатан Аллен

3
Це дуже корисно. Для таких людей, як я, які намагаються зрозуміти, що тут відбувається, загальна форма START[^START]*?END(де START і END - це ваші регулярні вирази символів початку і кінця). По суті, це означає "
збігати будь-що від СТАРТУ ДО
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.