假设我想在字符串"abc"
中匹配s
,只要它恰好出现在索引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)
似乎在不使用输入上的Substring的情况下实现此的唯一方法是这样的:
var match = new Regex("abc").Match("0123abc", n);
Console.WriteLine(match.Success && match.Index == n);
这不是太糟糕,除了在起始偏移处没有匹配时,整个输入将被不必要地扫描,这对于大多数正则表达式来说可能比实际创建子字符串更慢。到了比赛。 (虽然我没有时间)。
我是否错过了明显的过载或设置,只会限制匹配到提供的偏移量?
答案 0 :(得分:3)
使用\G
:
var match = new Regex(@"\Gabc").Match("0123abc", n);
来自the docs:
如果要限制匹配以使其从字符串中的特定字符位置开始并且正则表达式引擎不扫描字符串的其余部分以进行匹配,请使用
\G
锚定正则表达式...这限制了匹配,因此它必须始于startat
。
答案 1 :(得分:0)
您可以在正则表达式的开头使用\G
,以确保它在开头时匹配。
(^
不起作用。)
在PowerShell中进行测试:
PS> $r = [regex]"\Gabc" PS> $r.IsMatch("01abc",2) True PS> $r.IsMatch("012abc",2) False