如何创建正则表达式

时间:2013-09-15 15:28:48

标签: c# regex

我需要解析以下字符串格式:

property1 value1
property2 value2
property3 val.ue3

其中左侧单词是属性,后面的单词是其值。 该值应在(\n\r)处进行裁剪。

我使用以下代码:

Regex reg = new Regex(string.Format("{0}\\s\\w+", propertyName));
string Val = reg.Match(str).Value;

但它有一些问题,我很难尝试解决它们:

  • 如果值为.,则会修剪其中的字符串(例如,对于property3,它会返回val,但它应返回val.ue3
  • 它不会修改新行或空格中的值(有时会返回value2\r

5 个答案:

答案 0 :(得分:1)

我会用这个

Regex reg = new Regex(string.Format(@"{0}\s+[^\r\n]+", propertyName));

所以,如果你有一个propertyNames列表

 var output=propertyNames.Select(x=>
            new{
               PropertyName=x,
               Value=Regex.Match(input,string.Format(@"(?<={0}\s+)[^\r\n]+",x))
                          .Value
             });

答案 1 :(得分:1)

  

如果值为“。”它修剪了那里的字符串(即对于property3,它返回val,但它应该返回value3)

这是因为\\w+匹配字母数字字符和下划线,它与点字符.不匹配。

  

它不会修改新行或空格中的值(有时返回 - “value2 \ r \ n”)

我可以看到这可能是怎么回事,因为正如我上面所说的那样\\w+匹配单词字符,所以一旦它发现任何其他字符就停止匹配。

更好的正则表达式:

由于传入了属性的名称,我们只剩下一个任务,即匹配值,因为值始终以换行符\n,回车符\r或点结束.然后我们可以匹配一个或多个不是捕获值的字符,如下所示:

{0}\\s*([^\\r\\n ]+)
               ^^
          There is a space here, don't forget it

请注意,上面字符类中的后面只有一个空格\\n

RegexHero Demo

答案 2 :(得分:0)

将字符串放入字典并使用它似乎更合适。

var dict =
    str.Split(new char[] {'\r', '\n'}, StringSplitOptions.RemoveEmptyEntries)
       .Select(x => x.Split(new char[] {' '}, 2))
       .ToDictionary(x => x[0], x => x[1]);

string val = dict[propertyName];

Hey, it works!

答案 3 :(得分:0)

我认为你不需要正则表达式。 Split方法应该切掉芥末:

string input = 
@"property1 value1 
property2 value2 
property3 val.ue3";
IList<KeyValuePair<string, string>> result =
    (from line in input.Split(new[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries)
    let parts = line.Split(' ')
    where parts.Length > 1
    select new KeyValuePair<string, string>(parts[0], parts[1])).ToList();

现在您可以使用包含键值对的结果:

property1: value1
property2: value2
property3: val.ue3

答案 4 :(得分:0)

\w匹配任何字母,数字或下划线(有关精确定义,请参阅Word Character),但它与文字.不匹配。为此,您可以使用字符类,例如[\w.]

另外,如果您正在使用其他字符串构建模式,那么您真的应该使用Regex.Escape

Regex reg = new Regex(string.Format(@"{0}\s[\w.]+", Regex.Escape(propertyName)));
string Val = reg.Match(str).Value;

或者可能省略string.Format

Regex reg = new Regex(Regex.Escape(propertyName) + @"\s[\w.]+");
string Val = reg.Match(str).Value;

请注意使用@创建逐字string字面值。这通常使正则表达式更容易阅读,因为您不需要在模式中转义\