我正在研究一个独特的正则表达式规则,该规则可以验证两种不同格式的任何实数:
点(千)和逗号(十进制)
123 ; 1.234.567 ; 12.345.678 ; 123.456.789 ; 1.234.567,89 ; 1.234,56789 ; 1,2 ; 0,123
逗号(千)和点(十进制)
1,234,567 ; 12,345,678 ; 123,456,789 ; 1,234,567.89 ; 1,234.56789 ; 1.2 ; 0.123
还有其他一些限制要注意:数字可以在短语的中间,它的开头可以有标记(+,-,+ /-,±),而结尾可以有(e,exp,^) 。
我已经为此目的创建了一个帖子,最终的解决方案在这里:
(^|\s)[±+-]?\d{1,3}(?:(e|E|exp)\d+)?($|\s)|(^|\s)[±+-]?(?:([1-9]{1,3}(?:\.\d{3})*|[0])(?:,\d*)?(?:(e|E|exp)\d+)?)($|\s)|(^|\s)[±+-]?(?:([1-9]{1,3}(?:,\d{3})*|[0])(?:\.\d*)?(?:(e|E|exp)\d+)?)($|\s)
到目前为止一切正常。但是,当数字位于以点(。)或逗号(,)或任何其他字符结尾的短语的末尾时,我发现了一个问题。它不再检测到该数字。
一个简单的测试案例:“我的电话号码是123,456,789.89、0.123和123.456.789,89。”
请注意,解决此问题的唯一方法是在数字旁边添加一个空格。我尝试创建替换正则表达式规则,以在数字和下一个字符之间添加空格。没有成功...
有人能再帮我一次吗?
我建议($|\s)
像(?=[,.]*(?:$|\s))
这样先行调整尾随边界,以检查(但不消耗)数字后是否有.
或,
紧跟空格或字符串结尾:
(?<=^|\s)[±+-]?\d{1,3}(?:(?:[eE](?:xp)?)\d+)?(?=[.,]*(?:$|\s))|(?<=^|\s)[±+-]?(?:(?:[1-9]{1,3}(?:\.\d{3})*|[0])(?:,\d*)?(?:(?:[eE](?:xp)?)\d+)?)(?=[.,]*(?:$|\s))|(?<=^|\s)[±+-]?(?:(?:[1-9]{1,3}(?:,\d{3})*|0)(?:\.\d*)?(?:(?:[eE](?:xp)?)\d+)?)(?=[.,]*(?:$|\s))
您还可以缩短代码并通过替换(e|E|exp)
为来增强代码(?:[eE](?:xp)?
。所有非捕获组都可以变成捕获组,但是使用RegexOptions.ExplicitCapture
仍然可以得到一个干净的Match对象。
(?<=^|\s)[±+-]?\d{1,3}([eE](xp)?\d+)?(?=[.,]*($|\s))|(?<=^|\s)[±+-]?(([1-9]{1,3}(\.\d{3})*|0)(,\d*)?([eE](xp)?\d+)?)(?=[.,]*($|\s))|(?<=^|\s)[±+-]?(([1-9]{1,3}(,\d{3})*|0)(\.\d*)?([eE](xp)?\d+)?)(?=[.,]*($|\s))
您还可以添加RegexOptions.Ignorecase
标志并替换[eE](xp)?
为e(xp)?
以进一步缩短模式。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句