单词首次出现的最快正则表达式

时间:2018-10-24 10:53:48

标签: c# regex

我希望我的正则表达式将以下类型的字符串捕获为两个带有"%3f"的Urls。

https://*****%3f****%3D,https://*****%3f****%3D …

此类型的每个字符串URL均应自行捕获。注意-这里的*是为了简化起见,URL可以位于大字符串的任何部分,且介于两者之间。

我的正则表达式现在是:

(https://\S+?%3f)(?<toDelete>\S+?%3D)

但是有人问我是否有一种非延迟的方法(或者只是更快的版本),因为它比贪婪要慢得多,并且此正则表达式将在巨大的字符串和数据流中调用。 请注意,我不能简单地放置\S*的原因是这样做会捕获从第一个http到最后一个%3D的一次匹配。

1 个答案:

答案 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+?的模式慢一点,但是当匹配的字符串变长时,效率会大大提高。