Regex 对正则表达式中的特定组求反

Regex 对正则表达式中的特定组求反,regex,vb6,Regex,Vb6,如何获取不包含特定组的字符串 (?:[0-9-+*/()x]|abs|pow|ln|pi|e|a?(sin|cos|tan)h?)+ 上面的字符串是数学表达式的正则表达式。如何得到非数学表达式的字符串 输入字符串示例:WIDTH+LENGTH*abs(2) 预期输出:WIDTHLENGTH您可以在负前瞻中使用正则表达式,然后添加一个\w速记类以匹配字母数字符号,或[a-zA-Z]与\b字边界: (?![0-9-+*/()x]|abs|pow|ln|pi|e|a?(?:sin|cos|tan)h

如何获取不包含特定组的字符串

(?:[0-9-+*/()x]|abs|pow|ln|pi|e|a?(sin|cos|tan)h?)+
上面的字符串是数学表达式的正则表达式。如何得到非数学表达式的字符串

输入字符串示例:
WIDTH+LENGTH*abs(2)


预期输出:
WIDTH
LENGTH
您可以在负前瞻中使用正则表达式,然后添加一个
\w
速记类以匹配字母数字符号,或
[a-zA-Z]
\b
字边界:

(?![0-9-+*/()x]|abs|pow|ln|pi|e|a?(?:sin|cos|tan)h?)\b[a-zA-Z]+\b

因为我们只允许带有
[a-zA-Z]
的字母,所以我们可以将其进一步简化为

(?!x|abs|pow|ln|pi|e|a?(?:sin|cos|tan)h?)\b[a-zA-Z]+\b
请参见

虽然在大多数情况下可能有效,但这并不是问题中正则表达式的真正反转,因为有两个正则表达式不匹配的地方:

  • 空间
  • 特殊字符,如
    ?!^~;:,。[]{}
    (可能更多)
以及两个正则表达式所匹配的内容:

  • 字符串,例如
    axabs(3)
    ,其中
    xabs
    部分由两者匹配
这也许可以通过摆弄来解决,但见鬼,我想要一个实际的反转!:P

这就是:

(?:(?!e|ln|(?<=l)n|pi|(?<=p)i|abs|(?<=a)bs|(?<=ab)s|pow|(?<=p)ow|(?<=po)w|sin|(?<=s)in|(?<=si)n|cos|(?<=c)os|(?<=co)s|tan|(?<=t)an|(?<=ta)n|asin|acos|atan)[^0-9-+*/()x])+
  • 匹配上面的一次或多次(
    (?:…)+

  • 当您想“跳过”某个表达式时,通过合并类似于
    (?的部分,您可以在正则表达式中执行以下操作:

    "Tarzan"|skip1|skip2|skip3|more|complicated|expressions|here|(Tarzan)
    
    …就这么简单

    当您迭代regex matches集合时,您只需要在第一个捕获组中包含任何内容的匹配项,而忽略任何其他匹配项


    没有必要使用复杂的环视,因为它通常不适用于重叠的边缘情况。

    只是好奇……既然您使用的是非捕获组,您在用它做什么?语法验证?
    ?:
    可以忽略。@Siguzathe我想到的唯一一件事是消极的前瞻
    (?)
    或者更确切地说是负向查找
    (?。使用lookbehind时,请确保使用固定宽度的捕获组。有用的资源:也在那里检查过。不好。如果可以,请给我一个答案。谢谢@brocan您提供了有关您使用的环境的更多详细信息?如编程语言、工具等。非常感谢!!它很有效。节省了我很多时间。在这种情况下,它非常有用可能与此无关,但请注意,这不是原始正则表达式的实际反转,因为两个正则表达式都不匹配,例如,像
    $§!?~:;,{}[]
    @Siguza:我同意这不是反转,也许,它甚至可以用更好的形式编写。我猜
    [0-9-+*/()x]
    不是必需的,因为我们只允许
    [a-zA-Z]
    。也许,我们可以将表达式简化为
    (?!x | abs | pow | ln | pi | e | a)(?:sin | cos | tan)h?\b[a-zA-Z]+\b
    。在
    axabs(3)
    ,它应该只提取第一个
    a
    分类为
    [a-zA-Z0-9]
    =>
    (?!x | abs | pow | ln | pi | e | a)(?:sin | cos | tan)h?\b[a-zA-Z0-9]+\b
    (?:(?!e|ln|(?<=l|si|ta)n|pi|(?<=p)i|abs|(?<=a)bs|(?<=ab|co)s|pow|(?<=p)ow|(?<=po)w|a?(?:sin|cos|tan)|(?<=s)in|(?<=c)os|(?<=t)an)[^0-9-+*/()x])+
    
    "Tarzan"|skip1|skip2|skip3|more|complicated|expressions|here|(Tarzan)