2016-08-02 100 views
1

我有模式字符串:“{Name}您好,欢迎{国家}
和一个完整的字符串值:’您好斯科特,欢迎越南
哪有我提取{Name}和{Country}的值:
Name = Scott,Country = VietNam
我已经看到一些正则表达式来解决这个问题,但我可以在这里应用模糊匹配吗?
例如用翻译字符串“欢迎来到越南,你好斯科特”,我们还必须改变正则表达式吗?获取字符串值

+0

我投票结束这个问题作为题外话,因为它不包含最小代码来重现问题。 –

+0

我尝试过使用正则表达式,但实际的问题是如何以较少的改变表达式来提取值。 – phuongnd

+0

@phuongnd更新后的答案,它将双向工作。 – 2016-08-02 03:17:20

回答

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组的正则表达式具有相同语法的标记。接下来,它使用修改的模式作为正则表达式来提取源字符串中的值。最后,它使用捕获的令牌名称与指定的捕获组来构建要返回的字典。

+0

有史以来最好的解决方案! – phuongnd

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

更好的是,使用正则表达式从模板中提取标记并构建新的正则表达式,其中原始标记被替换为已命名的捕获组,并且字符串的其余部分将被转义。 – seairth

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