从占位符C#获取字符串值

时间:2016-08-02 02:49:53

标签: c# .net regex matching

我有模式字符串:" Hello {Name},欢迎来到{Country} "
和一个完整的值字符串:" Hello Scott,欢迎来到越南"
如何提取{Name}和{Country}的值:
Name = Scott,Country = VietNam
我已经看到一些正则表达式来解决这个问题,但我可以在这里应用模糊匹配吗?使用反转字符串" 欢迎来到越南,Hello Scott ",我们还必须更改正则表达式吗?

3 个答案:

答案 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];