Я работаю над макросом VBA, и мне нужно использовать в нем регулярное выражение, но Regex.Test()
дает странные результаты.
Я хочу, чтобы он возвращал False, если находит c
после необязательного b
в строке abcd
. Я попробовал следующий шаблон:
ab?(?!c)
Но он возвращает True.
Я пытался исследовать это, и я думаю, что это из-за возврата, так как ab?(?!c)d
возвращает False, как и ожидалось. Но проблема в том, что я не знаю, что будет после c
, если что. Но попытка использовать что-то неконкретное, например ab?(?!c).
, по какой-то причине тоже верно.
Я также читал об атомной функции для поиска, но это только больше меня смутило.
ЕСЛИ регулярное выражение строки соответствует bc
ТОГДА ошибка, ИНАЧЕ успех
@MonkeyZeus Это не удастся для таких входов, как «abdbc», что, я думаю, не то, чего хочет ОП.
@ 41686d6564 Почему ты так говоришь? ОП заявил: «Если c
будет после b
, то потерпите неудачу». Используя силу отрицания, регулярное выражение bc
обнаружит существование этого нежелательного шаблона.
Что ж, принимая во внимание, что шаблон используется в методе .Test()
, проверки bc
действительно может быть достаточно для решения проблемы (и тогда на самом деле не требуется регулярное выражение). Если вы хотите сопоставить a
, за которым не следует bc
или c
, вы можете просто использовать a(?!b?c)
или a(?!c)(?!bc)
. Использование необязательного b
имеет смысл только в том случае, если вы извлекаете или заменяете совпадения. И обратите внимание, что a(?!b?c)
найдет совпадение в adac
@WiktorStribiżew Я тоже так понял. Ведущий a
и замыкающий d
кажутся несущественными для цели.
@MonkeyZeus Действительно, если ОП хочет только предотвратить «bc» где угодно. Они также могут просто использовать InStr(input, "bc") <> 0
; тогда нет необходимости в регулярном выражении. Хотя это возможно, я не думаю, что этого хотел ОП.
@ 41686d6564 Ага! Надеюсь, ОП все еще здесь и может прояснить путаницу ...
@deviance Пожалуйста, не редактируйте вопрос, добавляя комментарии типа «решено» или «спасибо» (см. это). Принятие ответа (что вы и сделали) является достаточным признаком того, что он решил вашу проблему. Как говорится, добро пожаловать. Я рад, что это помогло вам :)
Проблема с вашим подходом заключается в том, что, поскольку b
является необязательным, сопоставление будет успешным, если оно найдет a
(оно будет включать b
только в том случае, если за ним не следует c
).
Вам нужно что-то вроде следующего:
a(?!bc)b?
Демо .
Хитрость здесь в том, чтобы убедиться, что за a
не следует bc
. Другими словами, привяжите условие к a
, а не b
, потому что последнее является необязательным и может быть проигнорировано, когда условие не выполняется.
Если вы хотите, чтобы совпадение также не сработало, если c
находится сразу после a
(т. е. без b
), просто измените шаблон на:
a(?!b?c)b?
Демо .
Вам, наверное, нужно
a(?!bc)b?
. Демо .