正则表达式:在模板化语法中选择文本

时间:2010-02-22 16:03:19

标签: .net regex

我正在尝试获取此语法的value部分:

[name:value]

我得到了:

\[name:(\w*)]

哪个与整个事情相匹配。有没有人知道我只需要选择值的变化? (请记住,语法也会被其他文本包围。

3 个答案:

答案 0 :(得分:1)

正则表达式将始终与整个字符串匹配,但您可以使用 Groups 成员集合访问匹配部分:

public static void Main()
{
   string pattern = @"(\d{3})-(\d{3}-\d{4})";
   string input = "212-555-6666 906-932-1111 415-222-3333 425-888-9999";
   MatchCollection matches = Regex.Matches(input, pattern);

   foreach (Match match in matches)
   {
      Console.WriteLine("Area Code:        {0}", match.Groups[1].Value);
      Console.WriteLine("Telephone number: {0}", match.Groups[2].Value);
      Console.WriteLine();
   }
   Console.WriteLine();
}

(此示例取自引用的页面)

答案 1 :(得分:1)

Match.Result方法就是您想要的。请参阅API documentationdocumentation on Regex substitution patterns

使用Regex.Match(input, pattern).Result("$1")获取您想要的内容。

举一个完整的例子,这是我用来确认这个解决方案可行的单元测试:

[Test]
public void TestRegexMatchResult() {
    var input = "Other text [name:value] and other text";
    var pattern = @"\[name:(\w+)\]";

    Assert.AreEqual("value", Regex.Match(input, pattern).Result("$1"));
}

测试通过。

您还可以浏览字符串并提取多次出现的模式:

[Test]
public void TestRegexMatchesResult() {
    var input = "Some [name:value] pairs [name:something] here.";
    var pattern = @"\[name:(\w+)\]";

    var results = Regex.Matches(input, pattern).OfType<Match>()
        .Select(match => match.Result("$1"));

    Assert.AreEqual(2, results.Count());

    Assert.AreEqual("value", results.ElementAt(0));
    Assert.AreEqual("something", results.ElementAt(1));
}

最后,如果你需要将其抽象为“name”以外的其他内容,你可以这样做:

[Test]
public void TestMatchingNameAndValue() {
    var input = "[key:value] [another_key:some_other_value]";
    var pattern = @"\[(\w+):(\w+)\]";

    var results = Regex.Matches(input, pattern).OfType<Match>()
        .Select(match => new KeyValuePair<string, string>(
            match.Result("$1"),
            match.Result("$2")));

    Assert.AreEqual(2, results.Count());

    Assert.AreEqual("key", results.ElementAt(0).Key);
    Assert.AreEqual("value", results.ElementAt(0).Value);
    Assert.AreEqual("another_key", results.ElementAt(1).Key);
    Assert.AreEqual("some_other_value", results.ElementAt(1).Value);
}

答案 2 :(得分:0)

您可以使用lookaround仅匹配value

搜索(?<=\[name:)\w+(?=])

这意味着:匹配一个或多个字母数字字符,当且仅当它们前面有[name后跟]时。请注意,没有必要转义]