我的正则表达式代码如下:
(.(?!\[view street map\]))+
这是为了匹配[查看街道地图]之前的所有内容。
但是如果我在下面的
中使用这个正则表达式代码Test of the system[view street map]
匹配以下内容,并切断最后一个字符
Test of the syste
任何人都知道为什么会这样?
提前致谢!
答案 0 :(得分:2)
您必须添加一个起始锚点以匹配所有内容,直到[view street map]
如果该特定行上出现[view street map]
。如果[view street map]
不存在则匹配整行。
^(?:(?!\[view street map\]).)+
<强>解释强>
^
锚点,表示一行的开头。(?:..)
被称为非捕获组。(?:(?!\[view street map\]).)
在正则表达式引擎匹配第一个字符之前,它检查边界后面的字符串是否为[view street map]
。如果它是[view street map]
,那么它将无法匹配。如果它不是[view street map]
,那么只有它匹配第一个字符。如果我们在整个非捕获组之后添加+
,则regex引擎将从一开始就为每个字符执行上述步骤(不仅仅用于第一个字符)。 +
重复前一个令牌一次或多次。答案 1 :(得分:2)
您应该在使用角色之前进行检查:
^((?!\[view street map\]).)+
消耗然后检查不允许的字符串是否也错误地匹配字符串“[view street map]”。
我忘记了在之前版本中的锚定。我们需要确保匹配从字符串的开头开始,或者当引擎在下一个索引处重试匹配时可以绕过检查。
答案 2 :(得分:0)
(.(?!\[view street map\]))+
基本上是说匹配一个字符并检查[view street map]
是否提前。 m
已提前[view street map]
。所以它失败了。其余的都过去了。
您可以尝试:
\[view street map\]|(.)
抓取捕获并将它们连接在一起以获取字符串。请参阅demo。
或尝试
\[view street map\]
替换为空字符串。请参阅demo。
答案 3 :(得分:0)
您当前的逻辑 - 逐个采用所有符号,每个符号后面跟[view street map]
。您可以将逻辑更改为以下内容 - 将符号批处理后跟[view street map]
或end-of-string
。
.*?(?=(?:\[view street map\])|$)