匹配正则偏移的正则表达式

Sim*_*aus 7 .net c# regex

我想检查某个模式(例如双引号字符串)是否匹配精确位置.

string text = "aaabbb";
Regex regex = new Regex("b+");
// Now match regex at exactly char 3 (offset) of text
Run Code Online (Sandbox Code Playgroud)

我想检查是否regex匹配完全是char 3.
我看了一下,Regex.Match Method (String, Int32)但它的行为与我的预期不符.
所以我做了一些测试和一些解决方法:

public void RegexTest2()
{
    Match m;
    string text = "aaabbb";
    int offset = 3;

    m = new Regex("^a+").Match(text, 0); // lets do a sanity check first
    Assert.AreEqual(true, m.Success);
    Assert.AreEqual("aaa", m.Value);  // works as expected

    m = new Regex("^b+").Match(text, offset);
    Assert.AreEqual(false, m.Success);  // this is quite strange...

    m = new Regex("^.{"+offset+"}(b+)").Match(text); // works, but is not very 'nice'
    Assert.AreEqual(true, m.Success);
    Assert.AreEqual("bbb", m.Groups[1].Value);

    m = new Regex("^b+").Match(text.Substring(offset)); // works too, but 
    Assert.AreEqual(true, m.Success);
    Assert.AreEqual("bbb", m.Value);
}
Run Code Online (Sandbox Code Playgroud)

其实我开始相信new Regex("^.", 1).Match(myString)不会匹配任何东西.

有什么建议?

编辑:

我得到了一个有效的解决方案(解决方法).所以我的问题是关于速度和一个很好的实现.

CAF*_*FxX 10

你尝试过文档说的吗?

如果要限制匹配以使其从字符串中的特定字符位置开始并且正则表达式引擎不扫描字符串的其余部分以进行匹配,则使用\ G锚定正则表达式(在左侧为从左到右的图案,或在右边从右到左的图案).这限制了匹配,因此它必须在startat处准确启动.

即替换^\G:

m = new Regex(@"\\Gb+").Match(text, offset);
Assert.AreEqual(true, m.Success);  // should now work
Run Code Online (Sandbox Code Playgroud)

  • @CAFxX:它应该是`@"\ Gb +"`或`"\\ Gb +"`. (3认同)
  • 我确实阅读了http://msdn.microsoft.com/en-us/library/az24scfc.aspx:`匹配必须发生在上一场比赛结束时.这并没有说服我试一试.非常感谢你! (2认同)