簡體   English   中英

在Regex中首次出現匹配

[英]Get first occurence of match in Regex

我有以下文字:

“貓狗老鼠獅子”

我使用正則表達式搜索“狗”或“鼠標”:

Regex regex = new Regex(@"dog|mouse");

C#中Regex的行為方式是它首先搜索單詞dog。 如果找到匹配,則停止。 如何在正則表達式中找到我的任何單詞的第一次出現后停止,這意味着在“cat”之后停止,因為這首先出現?

我是否必須進行多次正則表達式搜索並匹配結果的索引? 或者是否可以在正則表達式中指定它?

不,你錯了。

Regex regex = new Regex(@"dog|mouse");

Regex regex = new Regex(@"mouse|dog");

兩者都會找到“狗”這個詞,即使在第二種情況下,“鼠標”這個詞在交替中也是第一個。

匹配行為與您描述的不同。 正則表達式將檢查第一個字符,如果它可以匹配第一個替代,如果這不匹配, 它將不會繼續第二個字符,它將嘗試第二個替代。

但是,交替的順序在另一方面很重要 你會遇到問題,當你有相同的開始的替代品,你從短到長訂購,例如

Regex regex = new Regex(@"Foo|Foobar");

這將永遠不會匹配“Foobar”這個詞,因為即使文本中有Foobar,它也會匹配第一個替代“Foo”。

為了避免這些問題,請從長到短訂購

Regex regex = new Regex(@"Foobar|Foo");

這將嘗試匹配“Foo”上的“Foobar”,當它識別時,沒有“b”跟隨,它嘗試第二種選擇並成功匹配“Foo”。

一種方法是使用帶有dotall選項的惰性量詞:

Regex regex = new Regex(@"^.*?\b(?>dog|mouse)\b");

另一種方法是這樣做;

Regex regex = new Regex(@"^(?>[^dm]*+|d++(?!og\b)|m++(?!ouse\b))*\b(?>dog|mouse)\b");

它更長但更有效率。 這個想法是避免懶惰的量詞,因為它測試每個字符以查看后面的內容。 在這里,我將開頭描述為“所有不是dm或者某些d后面沒有og或者一些m沒有跟隨ouse零次或多次。

(?>..)是一個原子組,這是為了避免正則表達式引擎回溯,它是一種“全有或全無”,更多信息在這里

++是一種占有量詞 ,可以避免回溯。

暫無
暫無

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

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