Как предотвратить сбой отрицательного просмотра вперед, если перед ним есть необязательная строка?

Я работаю над макросом VBA, и мне нужно использовать в нем регулярное выражение, но Regex.Test() дает странные результаты.

Я хочу, чтобы он возвращал False, если находит c после необязательного b в строке abcd. Я попробовал следующий шаблон:

ab?(?!c)

Но он возвращает True.

Я пытался исследовать это, и я думаю, что это из-за возврата, так как ab?(?!c)d возвращает False, как и ожидалось. Но проблема в том, что я не знаю, что будет после c, если что. Но попытка использовать что-то неконкретное, например ab?(?!c)., по какой-то причине тоже верно.

Я также читал об атомной функции для поиска, но это только больше меня смутило.

Вам, наверное, нужно a(?!bc)b?. Демо .

41686d6564 stands w. Palestine 09.12.2020 18:41

ЕСЛИ регулярное выражение строки соответствует bc ТОГДА ошибка, ИНАЧЕ успех

MonkeyZeus 09.12.2020 18:43

@MonkeyZeus Это не удастся для таких входов, как «abdbc», что, я думаю, не то, чего хочет ОП.

41686d6564 stands w. Palestine 09.12.2020 18:55

@ 41686d6564 Почему ты так говоришь? ОП заявил: «Если c будет после b, то потерпите неудачу». Используя силу отрицания, регулярное выражение bc обнаружит существование этого нежелательного шаблона.

MonkeyZeus 09.12.2020 18:58

Что ж, принимая во внимание, что шаблон используется в методе .Test(), проверки bc действительно может быть достаточно для решения проблемы (и тогда на самом деле не требуется регулярное выражение). Если вы хотите сопоставить a, за которым не следует bc или c, вы можете просто использовать a(?!b?c) или a(?!c)(?!bc). Использование необязательного b имеет смысл только в том случае, если вы извлекаете или заменяете совпадения. И обратите внимание, что a(?!b?c) найдет совпадение в adac

Wiktor Stribiżew 09.12.2020 19:05

@WiktorStribiżew Я тоже так понял. Ведущий a и замыкающий d кажутся несущественными для цели.

MonkeyZeus 09.12.2020 19:10

@MonkeyZeus Действительно, если ОП хочет только предотвратить «bc» где угодно. Они также могут просто использовать InStr(input, "bc") <> 0; тогда нет необходимости в регулярном выражении. Хотя это возможно, я не думаю, что этого хотел ОП.

41686d6564 stands w. Palestine 09.12.2020 19:13

@ 41686d6564 Ага! Надеюсь, ОП все еще здесь и может прояснить путаницу ...

MonkeyZeus 09.12.2020 19:14

@deviance Пожалуйста, не редактируйте вопрос, добавляя комментарии типа «решено» или «спасибо» (см. это). Принятие ответа (что вы и сделали) является достаточным признаком того, что он решил вашу проблему. Как говорится, добро пожаловать. Я рад, что это помогло вам :)

41686d6564 stands w. Palestine 11.12.2020 21:09
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
9
69
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проблема с вашим подходом заключается в том, что, поскольку b является необязательным, сопоставление будет успешным, если оно найдет a (оно будет включать b только в том случае, если за ним не следует c).

Вам нужно что-то вроде следующего:

a(?!bc)b?

Демо .

Хитрость здесь в том, чтобы убедиться, что за a не следует bc. Другими словами, привяжите условие к a, а не b, потому что последнее является необязательным и может быть проигнорировано, когда условие не выполняется.

Если вы хотите, чтобы совпадение также не сработало, если c находится сразу после a (т. е. без b), просто измените шаблон на:

a(?!b?c)b?

Демо .

Другие вопросы по теме