Дайте мне знать, если я должен удалить старый пост, но, возможно, кто-то захочет его прочитать.
Способ сделать «слова для поиска» внутри регулярного выражения выглядит так:
regex = @"(Key1|Key2|Key3|LastName|FirstName|Etc):"
То, что вы делаете, вероятно, не стоит усилий в регулярном выражении, хотя это может , вероятно, быть выполнено так, как вы хотите (хотя все еще не на 100% ясно о требованиях). Это включает в себя взгляд вперед к следующему матчу и остановку на этом этапе.
Вот переписать как регулярное выражение + обычный функциональный код, который должен сделать свое дело. Он не заботится о пробелах, поэтому, если вы спросите «Key2», как показано ниже, он отделит его от значения.
string[] keys = {"Key1", "Key2", "Key3"};
string source = "Key1:Value1Key2: ValueAnd A: To Test Key3: Something";
FindKeys(keys, source);
private void FindKeys(IEnumerable<string> keywords, string source) {
var found = new Dictionary<string, string>(10);
var keys = string.Join("|", keywords.ToArray());
var matches = Regex.Matches(source, @"(?<key>" + keys + "):",
RegexOptions.IgnoreCase);
foreach (Match m in matches) {
var key = m.Groups["key"].ToString();
var start = m.Index + m.Length;
var nx = m.NextMatch();
var end = (nx.Success ? nx.Index : source.Length);
found.Add(key, source.Substring(start, end - start));
}
foreach (var n in found) {
Console.WriteLine("Key={0}, Value={1}", n.Key, n.Value);
}
}
И вывод из этого:
Key=Key1, Value=Value1
Key=Key2, Value= ValueAnd A: To Test
Key=Key3, Value= Something