2010-04-17 33 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