Regex 正则表达式比

Regex 正则表达式比,regex,lazy-evaluation,Regex,Lazy Evaluation,我有以下正则表达式: (?<day>\d+). Tag, (?<way>.+)?( \((?<length>\d+?.?\d?)km\))? 问题是:它与长度不再匹配。如果我删除此问题的问题标记: (?<day>\d+). Tag, (?<way>.+)( \((?<length>\d+?.?\d?)km\)) (?\d+)。标记,(?。+)(\((?\d+?。?\d?)km\) 它匹配第一个和第二个,而不是第三个。我

我有以下正则表达式:

(?<day>\d+). Tag, (?<way>.+)?( \((?<length>\d+?.?\d?)km\))?
问题是:它与长度不再匹配。如果我删除此问题的问题标记:

(?<day>\d+). Tag, (?<way>.+)( \((?<length>\d+?.?\d?)km\))
(?\d+)。标记,(?。+)(\((?\d+?。?\d?)km\)
它匹配第一个和第二个,而不是第三个。我想我可以通过在末尾加上问号来解决这个问题。但是最后一个表达式变为懒惰。因此,我在
way-
表达式中添加了另一个问号,但它不会比上一个更懒惰。因此,该方法也与整个长度相匹配

那么,有没有可能定义不同程度的懒散呢?如果这不存在,我应该如何改变模式以匹配它


Julian

以下是一种匹配输入中所有预期元素的方法:

(?<day>\d+)\.\s+Tag,\s+(?<way>(?:[^()]|\((?!\d+(?:\.\d+)?km)[^()]*\))*?)(?:$|\s*(?<length>\(\d+(?:\.\d+)?km\)))
(?\d+)\。\s+标记、\s+(?(?:[^()].\((?!\d+(?:\.\d+)?km)[^()]*\)*(?:$\s*(?\(\d+(?:\.\d+)?km\)


您可以将整个
方式
与后面的
km
匹配,该方式不包含括号结构,也不包含整数或浮点数。长度仅在存在时匹配。还请注意,文字点必须转义(
\.
)。

您不能将
(休息日)
(\d+?。?)km
匹配。预期的输出是什么?我认为问题在于中的
+
可以匹配开括号字符
)。也许可以使用
[^\(]
来代替它?@stribizev:是的,因为它不应该匹配“(休息日)”。如果有公里表达式,长度应该匹配它。如果没有公里表达式,则“方式”将匹配。这就是重点,道路总是匹配所有东西,包括公里数。我明白了,所以这不是一个解决方案,对吗?顺便说一句,正则表达式的味道是什么?@pzelasko:不幸的是“(休息日)”应该通过方式表达来匹配。因此,如果我禁止使用括号,休息日将不会匹配。嗯…几乎。现在公里数也在方式表达中:/way只应该匹配“Berlin->London”,而不匹配(500.3km)那么,我已经重新使用了一点表达,它现在是否如预期工作?1.标记,Berlin->London(500.3km)日期:1路:柏林->伦敦长度:500.3 2.标记,伦敦->斯德哥尔摩(183公里)日期:2路:伦敦->斯德哥尔摩长度:183 3.标记,斯德哥尔摩(休息日)日期:3路:斯德哥尔摩(休息日)长度:非常感谢您的帮助,效果很好:)现在您完成了,看起来很简单--
(?<day>\d+)\.\s+Tag,\s+(?<way>(?:[^()]|\((?!\d+(?:\.\d+)?km)[^()]*\))*?)(?:$|\s*(?<length>\(\d+(?:\.\d+)?km\)))