2010-04-17 26 views
2

假設我想在字符串s內匹配​​,只有當它恰好出現在索引n處。如何在.NET中指定偏移量的Regex.IsMatch?

int n = 2; 
Console.WriteLine(new Regex("abc").IsMatch("01abc", n)); // true 
Console.WriteLine(new Regex("abc").IsMatch("0123abc", n)); // true (but want false) 
Console.WriteLine(new Regex("^abc").IsMatch("01abc", n)); // false (but want true) 

似乎只有這樣,才能做到這一點不使用輸入子字符串是這樣的:

var match = new Regex("abc").Match("0123abc", n); 
Console.WriteLine(match.Success && match.Index == n); 

這是不是太糟糕,但如果沒有匹配的起始偏移量,然後整個輸入將被不必要地掃描,這對於大多數正則表達式來說可能比在匹配之前實際創建子字符串要慢。 (雖然我沒有時間)。

我是否錯過了一個明顯的過載或設置,將限制匹配到提供的偏移只?

+0

:O我也想這樣做,但我不認爲這是可能的。感謝您問這個問題:) – mpen 2011-01-24 18:08:47

回答

3

使用\G

var match = new Regex(@"\Gabc").Match("0123abc", n); 

the docs

如果你想這樣它開始於一個特定的字符位置限制匹配在字符串中,正則表達式引擎不會掃描字符串的剩餘部分atch,將正則表達式與\G錨定在一起...這限制了匹配,因此它必須始於startat

0

您可以在正則表達式的開頭使用\G以確保它在開始處匹配。 (^不起作用)。

測試在PowerShell中:

 
PS> $r = [regex]"\Gabc" 
PS> $r.IsMatch("01abc",2) 
True 
PS> $r.IsMatch("012abc",2) 
False 
+0

您能舉個例子嗎?我已經證明一個不起作用。 ^在偏移處不匹配。 – 2010-04-19 07:40:42

+0

@romkyns:這表明我應該先測試:-(。但是看起來'\ G'確實有效......正在更新答案。 – Richard 2010-04-19 11:17:32