正则表达式更加懒惰

时间:2015-09-08 08:18:53

标签: regex lazy-evaluation

我有以下正则表达式:

<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\)) 表达式中添加了另一个问号,但它不会比最后一个更加懒惰。所以方式也匹配整个长度!

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

儒略

1 个答案:

答案 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) )。