【问题标题】:This regex isn't allowing the extra digit for some reason... why?由于某种原因,这个正则表达式不允许额外的数字......为什么?
【发布时间】:2021-01-05 20:23:57
【问题描述】:

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

我为此使用js on regex101

这些应该通过

  • 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 单独传递但不一起传递的方式传递。我怎样才能一起做呢?

为什么它不能处理其余的数字?我该如何解决?

更新:如果您设法找到正则表达式,请解释它是如何工作的。谢谢。

【问题讨论】:

  • 可以分享一下你正在使用的JS吗?它是否使用任何标志?
  • @evolutionxbox 没有标志,我的问题是正则表达式......而不是 JS。需要吗?
  • 分享它很有用,因为它可能会突出您可能忽略的其他内容。
  • Your regex 不仅仅匹配3
  • @evolutionxbox 抱歉,我实际上没有任何 JavaScript 代码。错误直接来自 regex101 而不是 js。但我相信我将使用pattern.exec(nums[i]) 运行代码

标签: javascript regex


【解决方案1】:

您可以使用this answer 中的^(\d+\.)?(\d+\.)?(\*|\d+)$ 进行版本编号正则表达式。

如果您只需要点之间的单数,请删除 + 符号,结果是:

^(\d\.)?(\d\.)?(\*|\d)$

【讨论】:

  • 这个正则表达式代码似乎和我上面所说的有同样的问题。 (但我希望它匹配完整的数字。例如:3.5 匹配,但它匹配 3.5
  • 它们仍然是匹配 1 的一部分。是的,3. 是匹配 1 捕获组 1,5 是匹配 1 捕获组 2,但正则表达式会产生单个匹配。跨度>
  • 由于他不需要捕获不同的部分,所以使用非捕获组使其更清晰。
  • ^ ^(?:\d+\.)?(?:\d+\.)?(?:\*|\d+)$ 或缩短为^(?:\d+\.){0,2}(?:\*|\d+)$ 单位数版本可进一步缩短为^(?:\d\.){0,2}[*\d]$
【解决方案2】:

^\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),无限:*
可能后跟一对句点+asterix ((\.\*)?) - 对:(\.\*),可能(单/无):?
最后:$

如果您想要一个非零数字,请将所​​有 ds 替换为 [1-9]

如果您想要一个数字而不是数字,请在每个 d:^\d+(\.\d+)*(\.\*)?$ 之后添加一个“+”。
并且没有前导零:^[1-9]\d*(\.[1-9]\d*)*(\.\*)?$

【讨论】:

    【解决方案3】:

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

    ? -> 后跟一个?,它与前面标记的 0 到 1 匹配...

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

    ? -> 后跟一个?,它与前面标记的 0 到 1 匹配...

    (?:\d) -> 非捕获组,数字 \d 匹配 0-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 &lt;input id="input"&gt;

    【讨论】:

    • 3.5.* 应该被允许,但不是你的正则表达式
    【解决方案4】:

    您可以匹配一个数字后跟一个可选的小数部分和一个可选部分来匹配一个点后跟一个星号或一个数字。

    为了防止部分匹配,您可以使用锚来断言字符串的开头^$ 结尾。

    ^\d(?:\.\d)?(?:\.[*\d])?$
    

    说明

    • ^ 字符串开始
    • \d匹配一个数字
    • (?:\.\d)? 可以选择匹配一个点后跟一个数字
    • (?:\.[*\d])? 可以选择匹配点和* 或数字
    • $ 字符串结束

    Regex demo

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-05-02
      • 2022-12-17
      • 2014-09-28
      相关资源
      最近更新 更多