2016-11-13 64 views
1

正如我在标题中所说的,我认为这个想法是将其拆分为类似于\d+?=.*?\d=的东西,但不太确定...任何想法如何最好地解析此字符串:用正则表达式作为分割器分解为字典

1=Some dummy sentence 2=Some other sentence 3=Third sentence which can be in the same line 4=Forth sentence some text which shouldn't be captured and spplitted

什么我希望从这个得到的是一个字典里面会有这个号码键,此字符串的值,因此,例如:

1, "Some dummy sentence" 2, "Some other sentence" 3, "Third sentence which can be in the same line" 4, "Forth sentence"

回答

1

方法,解析文本词典:

public static Dictionary<int, string> GetValuesToDictionary(string text) 
{ 
    var pattern = @"(\d+)=(.*?)((?=\d=)|\n)"; 
    //If spaces between digit and equal sign are possible then (\d+)\s*=\s*(.*?)((?=\d\s?=)|\n) 
    var regex = new Regex(pattern); 

    var pairs = new Dictionary<int, string>(); 
    var matches = regex.Matches(text); 
    foreach (Match match in matches) 
    { 
     var key = int.Parse(match.Groups[1].Value); 
     var value = match.Groups[2].Value; 
     if (!pairs.ContainsKey(key)) 
     { 
      pairs.Add(key, value); 
     } 
     //pairs.Add(key, value); 
    } 

    return pairs; 
} 

在这种情况下,我是否LKEY已经存在,如果是的话我不加,但你可以看到自己,如果你需要此项检查。 包含数值组中没有等号的数字组。

+0

这个工作几乎和我一样,可以修改这个正则表达式,在\ r \ n?因为对于上次匹配的项目,它还需要从波纹管的内容... – ShP

+0

我想我在上次编辑中纠正了这一点。查看编辑过的正则表达式。 –

+0

是的,我只是注意到:)工程就像一个魅力!非常感谢你。 – ShP

1

什么AB出这样的:https://regex101.com/r/6ED8Om/2

\n?(\d+)=(.*?)(?= *\d|\n) 
  • \n?(\d+)=匹配可选的新行字符后跟数字和等号
  • (.*?)以下文本
  • (?= *\d|\n)匹配任意数量的空格后面跟着一个数字,或者一个新的生产线相匹配字符。空格阻止#2包含它的末端之间的两个空格#3

编辑:使用其他答案代码与此正则表达式将您的值保存到一个字典。组1匹配数字,组2匹配文本。

+0

感谢您的正则表达式的解释,我接近我的最初正则表达式,但再次远离工作版本... :) – ShP

+0

这可以修改某种方式来捕获值也如果有一个数字里面?例如,像这里https://regex101.com/r/6ED8Om/3,其中“测试值5中的数字”应该被捕获为值。 Nvm,就像这样:\ n?(\ d)=(。*?)(?= \ d \ = | \ n)':) – ShP