[英]Fastest regex for first occurence of a word
我希望我的正則表達式捕獲以下類型的字符串,作為其中包含"%3f"
兩個Urls。
https://*****%3f****%3D,https://*****%3f****%3D …
該類型的每個字符串URL均應在何處捕獲。 注意-此處的*
是為了簡化起見,URL可以位於大字符串的任何部分,且介於兩者之間。
我的正則表達式現在是:
(https://\S+?%3f)(?<toDelete>\S+?%3D)
但是有人問我是否有一種非延遲的方法(或者只是一種較快的版本),因為它比貪婪要慢得多,並且此正則表達式將在巨大的字符串和數據流中調用。 請注意,我不能簡單地放置\\S*
的原因是這樣做會捕獲從第一個http
到最后一個%3D
一個匹配項。
您可能會用逗號分割字符串,然后得到一個子字符串,最大為%3f
值。
如果要制作\\S*?
模式工作“更快”,您必須考慮到模式的這一部分應注意哪種上下文。
您可以匹配任意數量的非空白char,直到第一次出現%3f
為止。 也就是說,你想匹配以外的任何字符%
和空白或 %
未遵循與字符3f
。 這使得(?:[^\\s%]|%(?!3f))*
。 但是,交替會破壞整個優化思想。 您需要使用“展開循環”方法: [^%\\s]*(?:%(?!3f)[^%\\s]*)*
。
因此,整個模式看起來像
https://[^%\s]*(?:%(?!3f)[^%\s]*)*%3f
或與Delete
部分:
(https://[^%\s]*(?:%(?!3f)[^%\s]*)*%3f)(?<toDelete>[^%\s]*(?:%(?!3D)[^%\s]*)*%3D)
對於短字符串,最后一個模式可能比\\S+?
慢一點點\\S+?
基於模式的模式,但是當匹配的字符串變長時,它將變得更加高效。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.