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
(?:(?!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)