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