由于某种原因,此正则表达式不允许使用额外的数字...为什么?



我正在努力使其能够适应正则表达式,但我无法使其工作。

我在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.)->非捕获组,数字d0-9匹配。转义小数与小数匹配。

?->接着是与前面的令牌的0到1相匹配的CCD_ 40。。。

(?:d.)->非捕获组,数字d0-9匹配。转义小数与小数匹配。

CCD_ 44->然后是与前面的令牌的0到1相匹配的CCD_ 45。。。

(?:d)->非捕获组,数字d0-9匹配。

$结束字符串

注意: 这将允许0.**.00.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演示

最新更新