提问人:haael 提问时间:9/7/2023 最后编辑:Wiktor Stribiżewhaael 更新时间:9/8/2023 访问量:43
匹配两个数字的正则表达式
Regular expression to match two numbers
问:
我需要一个匹配 2 个浮点数的正则表达式,这些浮点数可以用空格、逗号或什么都没有分隔。
浮点数可以是整数(由数字组成)、分数(数字、小数点、数字)或跳过前导零的余数(小数点、数字)。它也可以以可选的加号或减号开头。浮点数不包含空格。
有效浮点数示例:、、、、、345678
976.4567
.765456
+8765456
-876.345
-.8765345
现在我想匹配两个数字,它们可以用任意数量的空格、逗号(带有可选空格)或任何 .i.e. 连接在一起,但前提是第二个浮点数不以数字开头。
用空格分隔的两个数字:8765 2345.34567
用逗号分隔的两个数字:3456.8765,567.234
两个数字用逗号和空格分隔:567865.667 , +87567.234323
两个数字连接在一起,但仍应分开匹配的示例:
5673+8667.45
-> 5673
,+8667.45
-0977.345.3456
-> -0977.345
,.3456
780-875
-> 780
,-875
+098+.45
-> +098
,+.45
为了让事情变得更难,必须对浮点子表达式进行分组,因为我想解析它们。因此,负号或正号必须包含在组中。
我当前的解决方案错误地匹配了一个数字,将最后一个数字视为第二个数字。
85678.96783
-> errorneusly 匹配为: ,85678.9678
3
此类字符串不得与表达式匹配。
答:
您可以用于原子(非回溯)非捕获组,例如(?>...)
([+-]?(?>[0-9]+(?:[.][0-9]*)?|[.][0-9]+))\s*,?\s*([+-]?(?>[0-9]+(?:[.][0-9]*)?|[.][0-9]+))
浮点匹配器取自此处:https://stackoverflow.com/a/12643073。我使内部组成为非捕获组,使数字部分原子化。[+-]?([0-9]+([.][0-9]*)?|[.][0-9]+)
(?:...)
测试代码:https://regex101.com/r/ZWNLBU/1(源自 @Thefourthbird 的链接)
评论
0.0
0., 0