簡體   English   中英

正則表達式匹配任何單詞 - 沒有非貪婪的運算符

[英]Regex match anything up to word - without non-greedy operators

我希望匹配任何特定單詞(例如,C */的結束注釋),但是,由於性能原因,我不想使用非貪婪的運算符。

例如,要匹配C注釋:/ /\\*.*?\\*/對我的文件來說太慢了。 有沒有可能提高性能?

當然,使用展開循環技術

/\*[^*]*(?:\*(?!/)[^*]*)*\*/

請參閱正則表達式演示

展開循環技術是基於這樣的假設:在大多數情況下,你知道重復的交替,這種情況應該是最常見的,哪一種是例外的。 我們將調用第一個,正常情況和第二個,特殊情況。 然后,展開循環技術的一般語法可以寫成:

normal* ( special normal* )*

這可能意味着,匹配正常情況,如果你找到一個特殊情況,匹配它比再次匹配正常情況。 您會注意到這種語法的一部分可能會導致超線性匹配。 為避免追加無休止的匹配,應謹慎應用以下規則:

  • 特殊情況的開始和正常情況必須是相互排斥的
  • special必須始終匹配至少一個字符
  • 特殊表達式必須是原子的:小心( special normal* )*可以簡化為(special)* ,如果特殊是special* ,這變得類似於(a*)*這是一個不確定的表達式。

C#模式聲明(使用逐字字符串文字):

var pattern = @"/\*[^*]*(?:\*(?!/)[^*]*)*\*/";

正則表達式細分:

  • /\\* - 文字/*
  • [^*]* - 除*以外的0個或更多字符
  • (?:\\*(?!/)[^*]*)* - 0或更多的序列......
    • \\*(?!/) - 文字*后面沒有/
    • [^*]* - 除*以外的0個或更多字符
  • \\*/ - 文字*/

下面是一個圖表,顯示3個可能相同的正則表達式的效率(在regexhero.net *上測試):

在此輸入圖像描述

*經過測試/* Comment * Typical * Comment */

試試這個:

/\\*(?:[^*]|\\*(?!/))*\\*/

我不知道它是否比stribizhev的答案更快。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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