我正在尝试获取此语法的value
部分:
[name:value]
我得到了:
\[name:(\w*)]
哪个与整个事情相匹配。有没有人知道我只需要选择值的变化? (请记住,语法也会被其他文本包围。
答案 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 documentation和documentation 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)