我对前瞻/后视正则表达式无法正常工作感到困惑

时间:2018-02-20 16:18:15

标签: regex lookahead lookbehind

我想解析以下字符串

void int g = <span id="sentenceColor">"c int void x is "</span> + 4;

我想找到不在元素内部的元素之外的void和int。我有以下正则表达式。

(?<!<span id="sentenceColor">.*)((int)|(void))(?!.+(<\/span>))

我假设上述方法使用lookbehind找到int或void,确保我没有跟随不确定数量的字符。还要确保这些单词后面没有不确定数量的字符和。我一直在使用在线正则表达式测试器,并认为可能有人比我有更好的经验。

2 个答案:

答案 0 :(得分:1)

你的正则表达式有一些错误:

  1. 它使用带有动态长度字符串的后视,即invalid
  2.   

    许多正则表达式,包括Perl,Python和Boost 使用的那些,只允许固定长度的字符串。您可以使用文字文本,字符转义,\ X以外的Unicode转义和字符类。 您无法使用量词或反向引用...

    1. 您提到要匹配void int,但您使用的是OR运算符:((int)|(void)),这将导致正则表达式只匹配一个他们。
    2. 冗余括号,创造了许多groups(虽然不是至关重要的,但它绝对不是一个好习惯)。

    3. 如果您想匹配代码中的voidint,可以使用此正则表达式,正确使用

      (?<=<span id="sentenceColor">).*(void int|int void)
      

      或者如果你想匹配标签之前的那些,你应该使用提前;这将是你所追求的正则表达式:

      (void int|int void).*(?=<span id="sentenceColor">)
      

答案 1 :(得分:0)

好吧,只要我知道,你就不能使用带有lookbehind的量词:/。 所以,你的&#39; *&#39;将无法正常工作并导致错误。我还不知道如何解决你的问题,但会不断尝试给出一个解决方案,至少,你知道它为什么不起作用的原因。 [编辑]:
好吧,以下 RegEx (\".*?\")选择&#39;之间的内容。 &#34; &#39 ;.
因此,我提出的解决方案是从原始字符串中删除与此正则表达式匹配的结果,然后,只需在新字符串上使用(int|void)即可。
希望这有帮助。
[编辑2]:
在下面,错误 Regex101 显示 lookbehind assertion is not fixed length - offset: 31
enter image description here