簡體   English   中英

單詞首次出現的最快正則表達式

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM