繁体   English   中英

如何得到正则表达式的逆?

[英]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 /]它将匹配除了什么是在括号中的一切。

http://www.regular-expressions.info/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM