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

时间:2011-02-13 10:49:44

标签: c# .net regex

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

示例

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

我想检查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);
}

事实上,我开始相信new Regex("^.", 1).Match(myString) 永远不会匹配任何内容。

有什么建议吗?

修改

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

3 个答案:

答案 0 :(得分:9)

你有没有试过docs说的话?

  

如果你想限制匹配,那么   它始于一个特定的   字符串中的字符位置和   正则表达式引擎没有   扫描字符串的剩余部分   匹配,锚定正则表达式   用\ G(左边是一个   从左到右的图案,或在右边   从右到左的模式)。这个   限制匹配,因此必须开始   恰好在startat。

即。将^替换为\G

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

答案 1 :(得分:1)

您希望Match(text, offset) 开始评估搜索到的字符串,就好像它是从偏移量开始一样。事实并非如此。 ^实际上会评估偏移0,而不是offset

因此,请使用^来评估offsetm = new Regex("^bbb$").Match(text, offset, text.Length-offset);

m = new Regex("^.{"+offset+"}bbb$").Match(text);

另一个选择是使用,但它比上面的那个慢:

m = new Regex(@"\Gbbb$").Match(text, offset);

或者这(第一种方法是最快的):

{{1}}

答案 2 :(得分:0)

您可以在正则表达式中添加正面的lookbehind断言((?<=...)):

Regex regex = new Regex("(?<=\A.{3})b+");

这确保在字符串开始(.{3})之后和正则表达式开始之前正好有三个字符(\A)。您也可以使用^代替\A,但由于前者也可能意味着(在某些情况下)“在一行开头匹配”,后者更明确一些。

您可能需要使用RegexOptions.Singleline编译正则表达式,以允许点也匹配换行符,如果这是必需的。

顺便说一下,

m = new Regex("^b+").Match(text, 3);

不起作用,因为^在行的开头匹配,而第一个b之前的位置当然不在行的开头。