<分区>
我在代码中有一个正则表达式(由其他人编写),我试图理解该表达式的含义。
var decimal = /^\d[0,1]+(\.\d[1,4])?$/;
谁能给我解释一下它的作用...
标签 javascript regex
<分区>
我在代码中有一个正则表达式(由其他人编写),我试图理解该表达式的含义。
var decimal = /^\d[0,1]+(\.\d[1,4])?$/;
谁能给我解释一下它的作用...
最佳答案
按顺序:
^
- 匹配输入的开头
\d
- 一个数字 (0-9)
[0,1]+
- 出现一次或多次字符 0
, ,
, 或 1
——但请看下面的注释,这可能不是作者的本意
(
- 捕获组的开始
\.
- 文字 .
(没有反斜杠,这将意味着一些特殊的东西)
\d
- 一个数字
[1,4]
- 正好是其中一个字符 1
, ,
, 或 4
——但请看下面的注释,这可能不是作者的本意
)
- 捕获组结束
?
- 表示整个捕获组是可选的(零次或一次)
$
- 匹配输入的结尾
回复[0,1]+
和 [1,4]
,表达式可能应该有 {0,1}
和 {1,4}
相反,这意味着:
{0,1}
- 匹配零次或一次之前的内容(请注意,您必须删除 +
之后的 [0,1]
)
{1,4}
- 匹配 1、2、3 或 4 次之前的内容
Here's an explanation on regex101.com
如果我们推测它们可能意味着 this
/^\d{0,1}(\.\d{1,4})?$/
...然后在散文中它的意思是:匹配可能有也可能没有一个前导数字的任何数字,然后可能有也可能没有小数点后跟一到四位数字。但它仍然有问题,尤其是字符串 ""
匹配它,并且(取决于你在做什么)你可能想要支持等于或大于 2
的值,该表达式没有。
基本上:如果它是为了验证小数,就把它扔掉,然后搜索能做得更好的东西,比如 this如果你真的想要最多四位数的精度并且你想要捕获小数部分(就像你原来的那样):
/^(?:0|[1-9]\d*)(\.\d{1,4})?$/
如果你想允许任何级别的精度:
/^(?:0|[1-9]\d*)(\.\d+)?$/
如果不需要捕获组:
/^(?:0|[1-9]\d*)(?:\.\d{1,4})?$/ // Only allow 1-4 digits of precision
/^(?:0|[1-9]\d*)(?:\.\d+)?$/ // Allow any number of digits of precision
That last可能是我会去的。请注意,它不允许允许您通常不会写的前导零(例如,它不允许 02.345
)。如果你想允许它们,那么只需 /^\d*(?:\.\d+)?$/
.
关于javascript - 需要了解一些正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27506595/