我有以下正则表达式:
<context-root>/</context-root>
我想要匹配这三种可能性:
(?<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\))
表达式中添加了另一个问号,但它不会比最后一个更加懒惰。所以方式也匹配整个长度!
那么,是否有可能定义不同程度的懒惰?如果不存在,我应该如何更改模式以匹配它?
儒略
答案 0 :(得分:1)
这是一种匹配输入中所有预期元素的方法:
(?<day>\d+)\.\s+Tag,\s+(?<way>(?:[^()]|\((?!\d+(?:\.\d+)?km)[^()]*\))*?)(?:$|\s*(?<length>\(\d+(?:\.\d+)?km\)))
请参阅demo
您可以匹配不包含括号构造的整个way
,也可以匹配不具有km
的整数或浮点数的整个\.
。长度仅在存在时才匹配。另请注意,必须转义文字点(0.5 (dec) is 1/2 which in binary as 0.1 (bin)
0.25 (dec) is 1/4 which in binary as 0.01 (bin)
0.125 (dec) is 1/8 which in binary as 0.001 (bin)
)。