正则表达式,初学者的一个例子

时间:2013-02-12 12:23:03

标签: c# regex

我正在试图找出一个非常简单的正则表达式,但我无法重构,为什么它不起作用。我以为我进入了正则表达式的东西,但遗憾的是它似乎并非如此:D

这是我想要匹配的表达式:

interval=4|termination=2012-09-18 22:00:00|days=3

通过这个,我希望有一个看起来像这样的匹配数组

match = array({"interval" => "4", "termination" => "2012-09-18 22:00:00", "days" = "3"});
//(pseudocode)

我在C#中使用它,因为我想拥有模式名称。我尝试了这种模式:

(.*)((termination=(?<termination>(.{19})))|(interval=(?<interval>(\d*)))|(days=(?<days>(\d*))))*(.*)

有人可以指出我失败的地方吗?

提前谢谢

3 个答案:

答案 0 :(得分:3)

我相信你来自PHP背景,你可以使用string.Split并强制输出到字典,如:

string str = "interval=4|termination=2012-09-18 22:00:00|days=3";
Dictionary<string,string> dict = str.Split('|')
                                    .Select(r => r.Split('='))
                                    .ToDictionary(t => t[0], t=> t[1]);

,输出为:

enter image description here

答案 1 :(得分:1)

|是正则表达式的特殊字符,表示交替。由于你想匹配文字|,你需要逃避它。

interval=(?<interval>\d*)\|termination=(?<termination>.{19})\|days=(?<days>\d*)

我也冒昧地清理你似乎不需要的捕获组。我还修改了正则表达式,因此它适用于Regex.Matches()方法。

我假设输入按指定的顺序出现。

答案 2 :(得分:1)

您获得的结果是什么?我敢打赌,(.*),贪婪,将消耗整个字符串,而其他部分(后缀为*)将匹配零次。因此匹配将成功,但捕获组将为空。那是你正在经历的吗?

我的建议是按照Habib的建议使用Split,但如果你想修复你的正则表达式,那么:

  • 制作第一组non-greedy (lazy)(.*?)
  • 修正字段的顺序,按照nhahtdh的建议转义|,或者:
  • 如果字段可能出现故障,您可能需要重复它们以接受零,一个或多个(不是正则表达式的最佳工作,但可行):

    (
        (termination=(...)|interval=(...)|days=(...))
        (\| (termination=(...)|interval=(...)|days=(...)) )*
    )?
    

    (为了便于阅读而添加了空格和换行符)