1

我试图找出一个非常简单的正则表达式,但我无法重建,为什么它不起作用。我以为我喜欢正则表达式的东西,但不幸的是它似乎不是这样: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*))))*(.*)

谁能指出我失败的地方?

提前谢谢

4

3 回答 3

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

输出将是:

在此处输入图像描述

于 2013-02-12T12:26:26.970 回答
1

|是正则表达式的特殊字符,表示交替。由于要匹配 literal |,因此需要对其进行转义。

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

我还冒昧地清理了您似乎不需要的捕获组。我还修改了正则表达式,以便它与Regex.Matches()方法一起使用。

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

于 2013-02-12T12:26:41.357 回答
1

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

我的建议是按照SplitHabib 的建议进行,但如果你想修复你的正则表达式,那么:

  • 使第一组非贪婪(懒惰)(.*?)
  • 修复字段的顺序,并|按照 nhahtdh 的建议进行转义,或者:
  • 如果字段可能出现乱序,您可能需要重复它们以接受零、一个或多个(对于正则表达式来说不是最好的工作,但可行):

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

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

于 2013-02-12T12:26:47.813 回答