在正则表达式中否定特定组

时间:2015-06-23 08:26:12

标签: regex vb6

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

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

上面的字符串是数学表达式的正则表达式。你如何获得不是数学表达式的字符串?

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

预期输出:WIDTH LENGTH

3 个答案:

答案 0 :(得分:4)

您可以在正面预测中使用正则表达式,然后添加\w速记类以匹配字母数字符号,或[a-zA-Z]添加\b字边界:

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

请参阅regex demo

由于我们只允许使用[a-zA-Z]的字母,我们可以将其进一步减少到

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

请参阅another demo

答案 1 :(得分:0)

虽然stribizhev's answer可能在大多数情况下有效,但问题中的正则表达式并不是真正的反转,因为正则表达式都不匹配:

  • 空间
  • 特殊字符,例如?!^~;:_,.[]{}<>(可能更多)。

正则表达式匹配的事情:

  • 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])+

它的工作原理如下:

  1. 匹配0-9-+*/()x(= [^0-9-+*/()x]
  2. 中的任何字符。
  3. 但是如果该字符与前面/后面字符的某个模式匹配,并且它本身就是某个字符,则不匹配该字符。
    使用否定前瞻((?!...))意味着每个|之后的第一个字符是当前字符,之后的字符是当前字符之后的字符,而(?<=)是否定的lookbehind,匹配某些前面的字符 因此,举例来说,为了匹配sin,我们需要&#34;不匹配&#34;如果s后跟in,则i后面跟s不匹配,n后跟n后跟si不匹配(?!sin|(?<=s)in|(?<=si)n) 1}}。
    在正则表达式中(仅限外观部分):e
    构建lnpi(?!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) 等的完整列表会导致:

    (?:...)+
  4. 匹配上述一次或多次((?<=l)n)。

  5. 通过将(?<=si)n(?<=ta)n(?<=l|si|ta)n等部分合并到(?:(?!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])+ ,可以缩短正则表达式:

    §°☀☁️❄️

    可以查看此演示以及漂亮的可视化on Debuggex

    注1:此正则表达式在JavaScript中不起作用,因为JS-regex不支持lookbehind。
    注意2:将一个单字节字符(例如Jun 23 13:03:53 MyIpad installd[34] <Error>: 0x485000 +[MIInstallable installablesAtURL:packageFormat:userOptions:error:]: 52: Failed to inspect package at file:///private/var/mobile/Library/Caches/com.apple.mobile.installd.staging/temp.QICyA0/extracted (Error Domain=NSPOSIXErrorDomain Code=2 "_IterateDirectory for file:///private/var/mobile/Library/Caches/com.apple.mobile.installd.staging/temp.QICyA0/extracted/Payload returned No such file or directory" UserInfo=0x165b5630 {FunctionName=-[MIFileManager urlsForItemsInDirectoryAtURL:error:], SourceFileLine=413, NSLocalizedDescription=_IterateDirectory for file:///private/var/mobile/Library/Caches/com.apple.mobile.installd.staging/temp.QICyA0/extracted/Payload returned No such file or directory}) Jun 23 13:03:53 MyIpad itunesstored[77] <Error>: 0x481000 __MobileInstallationInstallForLaunchServices_block_invoke240: Returned error Error Domain=MIInstallerErrorDomain Code=6 "Failed to inspect package at file:///private/var/mobile/Library/Caches/com.apple.mobile.installd.staging/temp.QICyA0/extracted" UserInfo=0x14768e20 {LegacyErrorString=PackageInspectionFailed, FunctionName=+[MIInstallable installablesAtURL:packageFormat:userOptions:error:], NSLocalizedDescription=Failed to inspect package at file:///private/var/mobile/Library/Caches/com.apple.mobile.installd.staging/temp.QICyA0/extracted, SourceFileLine=52, NSUnderlyingError=0x14620a40 "_IterateDirectory for file:///private/var/mobile/Library/Caches/com.apple.mobile.installd.staging/temp.QICyA0/extracted/Payload returned No such file or directory"} Jun 23 13:03:53 MyIpad itunesstored[77] <Warning>: ERROR: MobileInstallationInstallForLaunchServices returned nil Jun 23 13:03:53 MyIpad lsd[70] <Warning>: LaunchServices: installation failed for app com.mybundle.xxx )附加到Debuggex中的测试字符串可能会破坏它,但这不是我的正则表达式的问题,因为可以验证{{ 3}}

答案 2 :(得分:0)

当你想&#34;跳过&#34;这里的某些表达是你在正则表达式中所做的:

"Tarzan"|skip1|skip2|skip3|more|complicated|expressions|here|(Tarzan)

......就像The Best Regex Trick Ever一样简单。

当您迭代正则表达式匹配集合时,您只需要在第一个捕获组中包含任何内容的匹配项,并忽略任何其他匹配项。

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