正则表达式比

Regex more lazy than

我有以下正则表达式:

(?<day>\d+). Tag, (?<way>.+)?( \((?<length>\d+?.?\d?)km\))?

我想匹配这三种可能性:

1. Tag, Berlin -> London (500.3km)
2. Tag, London -> Stockholm (183km)
3. Tag, Stockholm (day of rest)

问题:长度不再匹配。如果我删除对此的问号:

(?<day>\d+). Tag, (?<way>.+)( \((?<length>\d+?.?\d?)km\))

它匹配第一个和第二个而不是第三个。我以为我可以通过在最后添加问号来解决问题。但是最后一个表达式变得懒惰。所以我向 way- 表达式添加了另一个问号,但它并没有变得比上一个更懒惰。所以方法也是匹配整个长度!

那么,是否可以定义不同程度的懒惰?如果不存在,我应该如何更改模式以使其正确匹配?

朱利安

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

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

demo

您可以将整个 way 不包含括号结构或它们没有整数或浮点数与 km 匹配。只有存在时才会匹配长度。另请注意,文字点必须转义 (\.).