javascript - Javascript 严格匹配和验证正则表达式
问题描述
我有
const int = /^[-+]?[1-9]+/
const float = /[+-]?([0-9]*[.])?[0-9]+/
// float return true for
float.exec(1234)
// int return true for
// it matches only 4848
int.exec(4848.48)
如何仅匹配整数并且仅与相应的正则表达式匹配?
解决方案
将开始^
和结束$
分隔符添加到匹配整数的表达式中,使其不能仅匹配浮点数的一部分(请参阅此regex101):
^[-+]?[0-9]+$
请注意,您对整数的原始表达式不会匹配其中带有零的整数。
在浮点情况下,执行相同操作并移动该点,使其变为非可选(请参阅此regex101)。要匹配文字点,您还可以转义它而不是使用字符组,这样它就不会.
意味着“任何字符”:
^[+-]?[0-9]*\.[0-9]+$
请注意,这将匹配:
- 前导零,例如
001
,00.2
- 带有尾随零的浮点数,例如
0.200000000
- 显式加号,
+123
,+1.2
,+.2
- 有符号零:
-0
和+0
分别+0.0
和-0.0
如果您不想要前导零,可以使用或( |
) 来区分。对于整数(参见regex101):
^[-+]?(?:0|[1-9][0-9]*)$
对于浮点数,您需要将非捕获组设为可选,以便以文字点开头的数字仍然有效(请参阅regex101):
^[+-]?(?:0|[1-9][0-9]*)?\.[0-9]+$
如果您想排除有符号零,这取决于您询问的对象在 math 中存在或不存在,但在大多数编程语言中是可分配的,您可以将可选符号移动到or的第二个条件中。对于整数(参见regex101):
^(?:0|[-+]?[1-9][0-9]*)$
对于浮动,这更棘手。如果您再次将符号移动到or的第二个条件中,您将不会匹配+0.0
and -0.0
,但您也不会匹配以文字点 or 开头的有符号数字0.
,因此这将不起作用(请参阅regex101)。
为了解决这个问题,您可以将整个事情包装在另一个条件中,或者在第二个条件中添加一个否定的前瞻,以明确区分0.0
和其他条件0.
(参见regex101):
^(?:0\.0*|[+-]?(?:(?!0\.0*$)0|[1-9][0-9]*)?\.[0-9]+)$
最后,如果您想断言该数字不以尾随零结尾,请在行(?<![0-9]0)
尾之后的最后添加一个适当的负向后查找$
(请参阅regex101):
^(?:0\.0*|[+-]?(?:(?!0\.0*$)0|[1-9][0-9]*)?\.[0-9]+)$(?<![0-9]0)
顺便说一句,您也可以使用\d
代替[0-9]
.
请注意,在 javascript 中,exec()
调用可能与评估为 的浮点参数不匹配0
,因为这发生在评估exec()
(参见jsfiddle)之前:
const float = /^[+-]?(?:0|[1-9]\d*)?\.\d+$/ // floats with no leading zeros
console.log(float.exec(0.0)) // null
console.log(float.exec(0.0000)) // null
console.log(float.exec(+0.0)) // null
console.log(float.exec(-0.0)) // null
console.log(float.exec('0.0')) // ["0.0"]
console.log(float.exec('0.0000')) // ["0.0000"]
console.log(float.exec('+0.0')) // ["+0.0"]
console.log(float.exec('-0.0')) // ["-0.0"]
推荐阅读
- c - 这个 C 函数是什么意思?函数指针?
- java - Cobertura 覆盖失败
- bokeh - 使用 Holoviews 和 Bokeh 绘制 10 亿个点,需要捕获 lasso 几何以获得所选点
- elasticsearch - 如何创建引用另一个变量的变量?
- sql - 对不匹配的列执行 MERGE INSERT 返回零行
- ios - 无法使用 Ad Hoc 分发单独导出 App Clip
- javascript - 如何使用 fetch 和 React Hooks 处理加载数据
- python - Python 中的哪些工具可以协助时间序列标签和对齐?
- python - 只匹配 IP 地址而不匹配其他号码
- css - 如何“导出” Material UI 组件的 CSS 并以编程方式将其应用到另一个?