我正在尝试使用正则表达式来查找可选的尖括号包围的数字,即<>
。我正在使用的模式,
<?(?P<fraction>[-+]?[-+0-9.Ee]+)>?
可以找到周围的括号。但如果只有一个括号,那么它也匹配。如果打开和关闭尖括号都在那里或者它们都不存在,我只希望它匹配。
我希望匹配以下内容:
-11.88
<0.012541>
-<3.14>
<-2.98>
我不想匹配:
<1.23
<-abcdefg>
我也不想重复我用来匹配数字的模式。这感觉就像一个容易出错的解决方案。
答案 0 :(得分:2)
天真的解决方案:复制/粘贴模式(第一个替代方案是尖括号,第二个替代方案没有):
<(?P<fraction>[-+]?[-+0-9.Ee]+)>|(?P<fraction>[-+]?[-+0-9.Ee]+)
更高级的解决方案:查看If-Then-Else Conditionals in Regular Expressions。如果某个组(命名或编号)匹配,它们允许您指定匹配的模式。因此,在您的情况下,您可以看到左角括号是否匹配,然后才匹配直角括号。
答案 1 :(得分:1)
^(-?<\d+\.\d+>)|(<-?\d+\.\d+>)|(-?\d+\.\d+)$
简单易维护是正则表达式的关键,它们最适合用于匹配,并且不在其中进行过程条件逻辑,这就是你要做的事情
答案 2 :(得分:0)
如果您不想重复正则表达式的数字部分,也许可以使用命名条件:
^[-+]?(?P<o><)?[-+0-9.Ee]+(?(o)>|)$
故障:
^ # Start
[-+]? # Get a -/+ if any
(?P<o><)? # Get a < if any
[-+0-9.Ee]+ # Get the numbers
(?(o)>|) # If a < was matched, match a >, otherwise, don't match anything
$ # End
如果你想要真正验证数字(并防止像-<-2>
这样的东西),你可以使用这样的东西:
^(?P<s>[-+])?(?P<o><)?(?(s)|[-+]?)\d+(?:\.\d+(?:[Ee][-+]\d+(?:\.\d+)?)?)?(?(o)>|)$
注意:我通常不会验证像.2e-.3
这样的内容(即没有前导零的小数),所以上面也可以防止这种情况发生。如果字符串是0.2e-0.3
但它允许前导零和尾随零,它确实有效。