我希望我的正则表达式将以下类型的字符串捕获为两个带有"%3f"
的Urls。
https://*****%3f****%3D,https://*****%3f****%3D …
此类型的每个字符串URL均应自行捕获。注意-这里的*
是为了简化起见,URL可以位于大字符串的任何部分,且介于两者之间。
我的正则表达式现在是:
(https://\S+?%3f)(?<toDelete>\S+?%3D)
但是有人问我是否有一种非延迟的方法(或者只是更快的版本),因为它比贪婪要慢得多,并且此正则表达式将在巨大的字符串和数据流中调用。
请注意,我不能简单地放置\S*
的原因是这样做会捕获从第一个http
到最后一个%3D
的一次匹配。
答案 0 :(得分:0)
您可能会用逗号分割字符串,然后得到一个子字符串,其值最高为%3f
。
如果要使“ \S*?
”模式“更快”运行,则必须考虑该模式的这一部分应注意的上下文。
您要匹配任意数量的非空白char,直到第一次出现%3f
为止。也就是说,您要匹配%
和空白{em>或 %
以外的其他字符,其后不跟3f
。这就是(?:[^\s%]|%(?!3f))*
。但是,交替会破坏整个优化思想。您需要使用“展开循环”方法:[^%\s]*(?:%(?!3f)[^%\s]*)*
。
所以整个模式看起来像
https://[^%\s]*(?:%(?!3f)[^%\s]*)*%3f
或带有Delete
部分:
(https://[^%\s]*(?:%(?!3f)[^%\s]*)*%3f)(?<toDelete>[^%\s]*(?:%(?!3D)[^%\s]*)*%3D)
对于短字符串,最后一个模式可能比基于\S+?
的模式慢一点,但是当匹配的字符串变长时,效率会大大提高。