我正在努力使其能够适应正则表达式,但我无法使其工作。
我在regex101上使用js。
这些应该通过
3
3.4
3.5.3
2.5.*
3.*
这些应该会失败
33.2
2.
3.1.2.
.2
3.1.2.
我当前的正则表达式是d?[.?]?
这仅批准3
。我尝试继续使用d?[.?d?]?
,但它仍然只允许使用3
。
编辑:从技术上讲,3.5
的通过方式与3.
和5
单独通过的方式相同,但不能一起通过。我怎样才能一起做?
为什么它不处理其余的数字?我该如何修复它?
更新:如果您找到正则表达式,请解释它是如何工作的。谢谢。
您可以使用^(d+.)?(d+.)?(*|d+)$
进行版本编号regex。
如果您只希望点之间有一个单数,则删除+
符号,得到:
^(d.)?(d.)?(*|d)$
^d(.d)*(.*)?$
var values=[
"3", "3.4", "3.5.3", "2.5.*", "3.*",
"33.2", "2.", "3.1.2.", ".2", "3.1.2."
];
values.forEach(value=>
console.log(
value,
value.match(/^d(.d)*(.*)?$/)?"Pass":"Fail"
)
);
function test() {
var value=document.getElementById("input").value;
document.getElementById("result").innerText=
value.match(/^d(.d)*(.*)?$/)?"Pass":"Fail";
}
<input id="input" onchange="test()">
<button onclick="test()">Test</button>
<span id="result"></span>
必须以一个数字(d
(开头(^
(
后面可以跟无限对周期+个位数((.d)*
(-对:(.d)
,无限:*
后面可以跟一对句点+星号((.*)?
(-对:(.*)
,可以(单/无(:?
结束:$
。
如果需要非零数字,请将所有d
替换为[1-9]
。
如果需要数字而不是数字,请在每个d
:^d+(.d+)*(.*)?$
后面加一个"+">
并且不带前导零:^[1-9]d*(.[1-9]d*)*(.*)?$
。
(?:d.)
->非捕获组,数字d
与0-9
匹配。转义小数与小数匹配。
?
->接着是与前面的令牌的0到1相匹配的CCD_ 40。。。
(?:d.)
->非捕获组,数字d
与0-9
匹配。转义小数与小数匹配。
CCD_ 44->然后是与前面的令牌的0到1相匹配的CCD_ 45。。。
(?:d)
->非捕获组,数字d
与0-9
匹配。
$
结束字符串
注意:
这将允许0.*
、*.0
、0.0.*
、0.*
和0,0,0
,其中*
=某个个个位数。。。如果你想把零过滤为零,那么更多的逻辑将是…
let regEx = /^(?:d.)?(?:*|d.)?(?:*|d)$/gm;
let el = document.getElementById('input');
el.addEventListener('keyup', function(){
let thisVal = this.value;
if(thisVal.match(regEx)){
console.log(thisVal + " is allowed")
}else(
console.log(thisVal + " is NOT allowed")
)
})
Enter a string <input id="input">
您可以匹配一个后面跟着可选小数部分的数字和一个可选小数部分,以匹配后面跟着星号或数字的点。
为了防止部分匹配,可以使用锚点来断言字符串的起始^
和结束$
。
^d(?:.d)?(?:.[*d])?$
解释
^
字符串开始d
匹配数字(?:.d)?
(可选(匹配后面跟数字的点(?:.[*d])?
(可选(匹配点和*
或数字$
字符串结束
Regex演示