我有模式字符串:" Hello {Name},欢迎来到{Country} "
和一个完整的值字符串:" Hello Scott,欢迎来到越南"
如何提取{Name}和{Country}的值:
Name = Scott,Country = VietNam
我已经看到一些正则表达式来解决这个问题,但我可以在这里应用模糊匹配吗?使用反转字符串" 欢迎来到越南,Hello Scott ",我们还必须更改正则表达式吗?
答案 0 :(得分:3)
您可以使用正则表达式:
var Matches = Regex.Matches(input, @"hello\s+?([^\s]*)\s*|welcome\s+?to\s+?([^\s]*)", RegexOptions.IgnoreCase);
string Name = Matches.Groups[1].Value;
string Country = Matches.Groups[2].Value;
更新:将代码更改为以任一方式工作。 Demo
答案 1 :(得分:1)
作为更通用的解决方案,您可以执行以下操作:
public Dictionary<string, string> GetMatches(string pattern, string source)
{
var tokens = new List<string>();
var matches = new Dictionary<string, string>();
pattern = Regex.Escape(pattern);
pattern = Regex.Replace(pattern, @"\\{.*?}", (match) =>
{
var name = match.Value.Substring(2, match.Value.Length - 3);
tokens.add(name);
return $"(?<{name}>.*)";
});
var sourceMatches = Regex.Matches(source, pattern);
foreach (var name in tokens)
{
matches[name] = sourceMatches[0].Groups[name].Value;
}
return matches;
}
该方法从模式中提取标记名称,然后使用与名为capture group的正则表达式的等效语法替换标记。接下来,它使用修改后的模式作为正则表达式从源字符串中提取值。最后,它使用捕获的令牌名称和命名的捕获组来构建要返回的字典。
答案 2 :(得分:0)
快点又脏......
string pattern = "Hello Scott, welcome to VietNam";
var splitsArray = pattern.Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries);
var Name = splitsArray[1].Replace(",", string.Empty);
var country = splitsArray[4];