如何在.NET中的指定偏移量处Regex.IsMatch?
假设我只想在字符串如何在.NET中的指定偏移量处Regex.IsMatch?,.net,regex,.net,Regex,假设我只想在字符串s中匹配“abc”,前提是它正好出现在索引n中 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));
s
中匹配“abc”
,前提是它正好出现在索引n
中
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);
这还不算太糟,只是当起始偏移量没有匹配时,整个输入将被不必要地扫描,这对于大多数正则表达式来说可能比在匹配之前实际创建子字符串慢。(不过我没有计时)
我是否缺少一个明显的重载或设置,该重载或设置会将匹配限制为仅提供的偏移量?您可以在正则表达式的开头使用
\G
,以确保它在开头匹配
(^
不起作用)
在PowerShell中测试:
PS> $r = [regex]"\Gabc"
PS> $r.IsMatch("01abc",2)
True
PS> $r.IsMatch("012abc",2)
False
PS>$r=[regex]“\Gabc”
PS>$r.IsMatch(“01abc”,2)
真的
PS>$r.IsMatch(“012abc”,2)
假的
使用\G
:
var match = new Regex(@"\Gabc").Match("0123abc", n);
发件人:
如果要限制匹配,使其从字符串中的特定字符位置开始,并且正则表达式引擎不会扫描字符串的其余部分以查找匹配项,请使用\G
。。。这限制了匹配,因此它必须恰好从startat
开始
你能举个例子吗?我展示了一个不起作用的偏移量不匹配。@romkyns:这表明我应该先测试:-(。但似乎
\G
确实有效…更新答案:O我也想这么做,但我认为不可能。谢谢你问这个:)