Звичайний вираз - рядок містить рядок "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.