当我尝试这个正则表达式
\"(\S\S+)\"(?!;c)
在此字符串“ MM:”上; d根据我的需要进行匹配
并在此字符串“ MM:”; c上按要求不匹配。
但是,当我添加第二个组时,可以通过在该组中移动分号并将其设置为|来使用。
\"(\S\S+)\"(;|)(?!c)
对于此字符串“ MM:”; c,当我期望它不像以前那样匹配时。
我先使用Java,然后使用Regex工具debuggex在Javascript上进行了尝试:
This link contains a snippet of the above
我究竟做错了什么?
注意|因此,没有必要使用分号。此外,在示例中,我将c替换为一个单词,这就是示例中为什么使用负前瞻的原因。
在遵循Holgers对使用数量词的回应之后,
\"(\S\S+)\";?+(?!c)
它起作用了,here is a link to it on RegexPlanet
最佳答案
问题是您不希望在正则表达式的意义上将分号设为可选。可选的分号表示允许匹配器尝试两种匹配或不匹配的匹配。因此,即使分号存在,匹配器也可以忽略它,从而为该组创建一个空匹配,从而使前瞻成功。
但是,如果要使用分号,则要使用它,因此不允许使用它来满足负面的超前期望。使用Java的正则表达式引擎非常简单:使用;?+
这称为“可能量词”。与?
一样,不需要在分号处,但如果在分号中必须匹配并且不能忽略。因此,正则表达式引擎已无可替代。
因此,如果您需要在组中使用分号,则整个模式看起来像\"(\S\S+)\";?+(?!c)
或\"(\S\S+)\"(;?+)(?!c)
。