如何获得不包含特定组的字符串?
(?:[0-9-+*/()x]|abs|pow|ln|pi|e|a?(sin|cos|tan)h?)+
上面的字符串是数学表达式的正则表达式。你如何获得不是数学表达式的字符串?
示例输入字符串:WIDTH+LENGTH*abs(2)
预期输出:WIDTH
LENGTH
答案 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])+
它的工作原理如下:
0-9-+*/()x
(= [^0-9-+*/()x]
) 但是如果该字符与前面/后面字符的某个模式匹配,并且它本身就是某个字符,则不匹配该字符。
使用否定前瞻((?!...)
)意味着每个|
之后的第一个字符是当前字符,之后的字符是当前字符之后的字符,而(?<=)
是否定的lookbehind,匹配某些前面的字符
因此,举例来说,为了不匹配sin
,我们需要&#34;不匹配&#34;如果s
后跟in
,则i
后面跟s
不匹配,n
后跟n
后跟si
不匹配(?!sin|(?<=s)in|(?<=si)n)
1}}。
在正则表达式中(仅限外观部分):e
构建ln
,pi
,(?!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)
等的完整列表会导致:
(?:...)+
匹配上述一次或多次((?<=l)n
)。
通过将(?<=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一样简单。
当您迭代正则表达式匹配集合时,您只需要在第一个捕获组中包含任何内容的匹配项,并忽略任何其他匹配项。
没有必要使用通常不适用于重叠边缘情况的复杂环视。