Метод Match.Result
- это то, что вы хотите. См. документацию API и документацию по шаблонам подстановки Regex .
Используйте 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);
}