将两个正则表达式合并为一个
Posted
技术标签:
【中文标题】将两个正则表达式合并为一个【英文标题】:Combine two regex expressions into one 【发布时间】:2018-06-04 13:15:56 【问题描述】:正则表达式必须匹配所有正双精度数,小数点后最多两位数,大于 0.01 的数字以及科学记数法,例如(1.0E7)。
我设法分别解决了这两个问题。
用于匹配所有小数点后最多 2 位数字和大于 0.01 的数字的正双精度:
"^(?!0+\\.0+$)^\\d+(?:\\.\\d1,2)?$"
对于任何数字,包括科学记数法:
"^[+-]?\\d+(?:\\.\\d*(?:[eE][+-]?\\d+)?)?$"
当我想将它们组合成一个时,问题就来了。
我尝试了here 描述的方法,但没有一个对我有用。 javascript/AngularJS 是使用的语言,如果它有任何重要性。
有什么建议吗?
【问题讨论】:
您不能使用 parseFloat 并根据结果数字检查您的条件吗? 除非这是一项测试任务,否则在可读性/可维护性方面值得怀疑 【参考方案1】:试试:
剥离^$
将每个原始正则表达式包含在一个non capturing 组中
“或”两组
将整体封闭在一个非捕获组中
在整个表达式中重新添加^
$
。
结果:
^(?:(?:(?!0+\\.0+$)^\\d+(?:\\.\\d1,2)?)|(?:[+-]?\\d+(?:\\.\\d*(?:[eE][+-]?\\d+)?)?))$
【讨论】:
我试过你的方法,但它没有想要的行为。我可以在小数点后引入超过 2 位数字和负值,它们可以匹配。两个正则表达式的组合不会像这两者之间的交集一样吗?还是有更好的方法? 我希望不能引入超过 2 位数字 :) 正则表达式应该匹配所有正双精度数,小数点后最多两位数,大于 0.01 的数字以及科学记数法,例如(1.0E7) 在同一时间 您可能希望将正则表达式分开。由于它们逐行工作,因此请尝试匹配一个正则表达式,然后尝试另一个。总之很奇怪。那应该行得通。尝试在 regex101 上发布一个示例 现在我正在使用带案例的开关,并且对于每个案例都有一个回报。例如:return "^(...)$"
,不知道有没有办法在这里添加多个检查...
问题是第二个表达式已经匹配了像 55.555 这样的数字。我的方法有效。第二个表达式示例:regex101.com/r/5bFRDQ/1【参考方案2】:
你可以将你的正则表达式分成块
(^(?!0+\\.0+$)^\\d+(?:\\.\\d1,2))?$ ?(^[+-]?\\d+(?:\\.\\d*(?:[eE][+-]?\\d+)?)?$)
【讨论】:
以上是关于将两个正则表达式合并为一个的主要内容,如果未能解决你的问题,请参考以下文章