我正在试图找出一个非常简单的正则表达式,但我无法重构,为什么它不起作用。我以为我进入了正则表达式的东西,但遗憾的是它似乎并非如此: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*))))*(.*)
有人可以指出我失败的地方吗?
提前谢谢
答案 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]);
,输出为:
答案 1 :(得分:1)
|
是正则表达式的特殊字符,表示交替。由于你想匹配文字|
,你需要逃避它。
interval=(?<interval>\d*)\|termination=(?<termination>.{19})\|days=(?<days>\d*)
我也冒昧地清理你似乎不需要的捕获组。我还修改了正则表达式,因此它适用于Regex.Matches()
方法。
我假设输入按指定的顺序出现。
答案 2 :(得分:1)
您获得的结果是什么?我敢打赌,(.*)
,贪婪,将消耗整个字符串,而其他部分(后缀为*
)将匹配零次。因此匹配将成功,但捕获组将为空。那是你正在经历的吗?
我的建议是按照Habib的建议使用Split
,但如果你想修复你的正则表达式,那么:
(.*?)
|
,或者:如果字段可能出现故障,您可能需要重复它们以接受零,一个或多个(不是正则表达式的最佳工作,但可行):
(
(termination=(...)|interval=(...)|days=(...))
(\| (termination=(...)|interval=(...)|days=(...)) )*
)?
(为了便于阅读而添加了空格和换行符)