正则表达式比
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
匹配。只有存在时才会匹配长度。另请注意,文字点必须转义 (\.
).
我有以下正则表达式:
(?<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
匹配。只有存在时才会匹配长度。另请注意,文字点必须转义 (\.
).