Звичайний вираз - рядок містить рядок "bar", але не передує "foo"


2

В даний час я маю регулярний вираз для відповідності рядку, який містить 'bar', але не передує 'foo':

(?<!foo)bar

Я бажаю змінити регулярний вираз, щоб він відповідав, коли рядок містить 'bar', але не передує 'foo' і (необов'язково) будь-який додатковий символ (и).

EG. "footestbar" не має збігатися з тим, що бар передує "foo", за яким слідує "test".

Я не можу знайти спосіб досягти цього, оскільки регулярні вирази не дозволяють використовувати квантор в межах негативного виду. Згодом я не можу зробити наступне:

(?<!foo.*)bar

Чи існує альтернативний підхід?

ОНОВЛЕННЯ:
Регулярний вираз вираження re2 . Зараз я переглядаю документацію, але на перший погляд помічаю наступне:

(?<!re)     after text not matching re (NOT SUPPORTED)

Тому рішення не може використовувати негативний погляд (якщо я правильно інтерпретую документацію).


"і (необов'язково) будь-який додатковий символ (и)" - що може передувати цьому? Чи має вона бути на початку рядка, або на початку слова? Також, будь ласка, вкажіть, який аромат регулярних виразів ви використовуєте, це може вплинути на відповідь.
Máté Juhász

Я тільки що отримав підтвердження, що це бібліотека регулярних виразів re2: github.com/google/re2/wiki/Syntax Я тільки що прочитав, що після невідповідності тексту не підтримується: (?<!re) after text not matching re (NOT SUPPORTED)
Fitzroy

Відповіді:


2

Змінений пост

Отже, здається, що деякі (більшість?) Двигунів Regex працюють тільки з фіксованою довжиною. Тим не менш, вони, здається, добре, щоб прийняти змінну довжину lookahead. Я не впевнений, що ваш варіант використання для цього є або наскільки він життєздатний, але одна ідея може бути, щоб змінити рядок, і використовувати:

rab(?!.*oof)

enter image description here

Звичайно, це виглядає смішним, і я не знаю, як ви його використовуєте або як це буде корисно. Більшість мого досвіду роботи з Regex використовувала .NET, і в основному не потрібні lookbehinds. Просто ідея для вас ..!

Оригінал публікації - працює лише з певними двигунами Regex (перевірено за допомогою .NET)

Спробуйте наступний регулярний вираз:

(?<!foo(?:.*)?)bar

Це додає необов'язкову, не захоплюючу групу в межах одного негативного погляду.

enter image description here


Цікаво. Який смак режексу ви перевірили на це? я використовую regex101.com і тестування проти pcre (php) і python, і це не працює, тому що " Lookbehinds повинні бути нульової ширини, тому квантори не допускаються ". Я не намагався перевірити JavaScript, тому що вважаю, що негативний погляд не підтримується.
Fitzroy

@ Fitzroy Це використання. NET регулярні вирази, я не впевнений, що, що перекладає на конкретний двигун регулярні вирази або один в його власному праві, я вважаю, що це так. Я побачу, якщо я можу отримати щось працює на regex101.
Jonno

@ Fitzroy Додано ідею для вас, чи можна її використовувати чи ні, я не знаю, тому що я не знаю вашого використання.
Jonno

Я не можу змінювати зміст, до якого я буду застосовувати регулярний вираз.
Fitzroy

@ Fitzroy Я дійсно не знаю інших способів, то, вибачте!
Jonno
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.