[英]How to get the inverse of a regular expression?
假设我有一个正则表达式,可以正常查找文本文件中的所有URL:
(http://)([a-zA-Z0-9\/\.])*
如果我想要的不是URL而是反向 - 除了URL之外的所有其他文本 - 是否有一个简单的修改来获得这个?
您可以使用空字符串搜索并替换与正则表达式匹配的所有内容,例如在Perl s/(http:\\/\\/)([a-zA-Z0-9\\/\\.])*//g
除了那些与正则表达式匹配的子字符串外,这将为您提供原始文本中的所有内容。
如果由于某种原因你需要一个只有正则表达式的解决方案,试试这个:
((?<=http://[a-zA-Z0-9\/\.#?/%]+(?=[^a-zA-Z0-9\/\.#?/%]))|\A(?!http://[a-zA-Z0-9\/\.#?/%])).+?((?=http://[a-zA-Z0-9\/\.#?/%])|\Z)
我稍微扩展了一组URL字符( [a-zA-Z0-9\\/\\.#?/%]
)以包含一些重要的字符,但这绝不是准确或详尽的。
正则表达式是一个怪物,所以我会试着打破它:
(?<=http://[a-zA-Z0-9\/\.#?/%]+(?=[^a-zA-Z0-9\/\.#?/%])
第一部分匹配URL的结尾。 http://[a-zA-Z0-9\\/\\.#?/%]+
匹配URL本身,而(?=[^a-zA-Z0-9\\/\\.#?/%])
断言URL必须后跟非URL字符,这样我们才能确定我们在最后。 使用前瞻,以便寻找非URL字符但不捕获。 整个事物被包裹在一个lookbehind (?<=...)
以寻找它作为匹配的边界,再次没有捕获该部分。
我们还希望在文件开头匹配非URL。 \\A(?!http://[a-zA-Z0-9\\/\\.#?/%])
匹配文件的开头( \\A
),然后是否定前瞻以确保没有URL潜伏在文件的开头。 (这个URL检查比第一个更简单,因为我们只需要URL的开头,而不是整个URL。)
这两项检查都放在括号和OR
“随着一起ð |
字符。 之后, .+?
匹配我们试图捕获的字符串。
然后我们来((?=http://[a-zA-Z0-9\\/\\.#?/%])|\\Z)
。 在这里,我们再次使用(?=http://[a-zA-Z0-9\\/\\.#?/%])
检查URL的开头。 文件的结尾也是一个非常好的迹象,表明我们已经达到了匹配的结束,所以我们也应该使用\\Z
来寻找它。 同样第一大集团,我们把它包在括号中和OR
两种可能性在一起。
|
符号需要括号,因为它的优先级非常低,因此您必须明确说明OR
的边界。
这个正则表达式在很大程度上依赖于零宽度断言( \\A
和\\Z
锚点以及环视组)。 在将它用于任何严重或永久性的事情之前,你应该总是理解一个正则表达式(否则你可能会遇到perl的情况),所以你可能想要检查字符串的开头和字符串锚点的结束以及Lookahead和Lookbehind零宽度断言 。
当然,更正欢迎!
如果我正确理解了这个问题,你可以使用搜索/替换...只是在表达式周围使用通配符,然后替换第一个和最后一个部分。
s/^(.*)(your regex here)(.*)$/$1$3/
我不确定这是否会按照您的意图完成,但它可能会有所帮助:无论您放置在方括号[]中的哪一个都将被匹配。 如果你把^支架,即在[^ A-ZA-Z0-9 /]它将匹配除了什么是在括号中的一切。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.