【问题标题】:javascript regular expression test for 6 digit numbers only. comma seperatedjavascript 正则表达式测试仅适用于 6 位数字。逗号分隔
【发布时间】:2020-03-30 19:31:51
【问题描述】:

所以这必须通过:

454555, 939999 , 019999    ,727663

它适用于输入 6 位数发票号码的用户。如果一个数字是 5 或 7 位而不是 6,它应该会失败。所以 1234567, 123456 应该会失败,因为一组超过 6 个数字。

到目前为止我有:

[0-9]{6}(\s*,*,\s*[0-9]{6})*

唯一的缺点是它接受 7 位或更多位数字。无法确定在这一点上是否可以同时执行这两种操作,测试用逗号和一个或多个空格分隔的 6 位数字,并且所有数字必须只有 6 位数字,如果不是则失败。

任何帮助表示赞赏。正则表达式不是我的强项。

谢谢

诺曼

【问题讨论】:

  • 如果只输入一个数字也应该通过:333222
  • 您是否尝试在末尾添加锚点 - ^$
  • @mvw 效果很好;我建议您删除您的误导性评论。
  • 你的正则表达式中有,*;您真的要允许123456,,,,,123456 有效吗?只有空格的输入怎么样,例如123456 123456;这有效吗?

标签: javascript regex


【解决方案1】:

你可以像下面的函数一样使用正则表达式来编写它。

const isPassword = (password: string) => /^\d{6}$/gm.test(password);

下面是一个示例测试文件。

  test('should recognize a valid password', () => {
    expect(isPassword('123456')).toBe(true);
    expect(isPassword('000000')).toBe(true);
  });

  test('should recognize an invalid password', () => {
    expect(isPassword('asdasda1234')).toBe(false);
    expect(isPassword('1234567')).toBe(false);
    expect(isPassword('a123456a')).toBe(false);
    expect(isPassword('11.11.11')).toBe(false);
    expect(isPassword('aaaaaa')).toBe(false);
    expect(isPassword('eeeeee')).toBe(false);
    expect(isPassword('......')).toBe(false);
    expect(isPassword('werwerwerwr')).toBe(false);
  });

【讨论】:

  • 你在回答什么问题?他们想要匹配由逗号分隔的列表
【解决方案2】:

为了验证完整的字符串,您可以使用这个正则表达式。

^(\s*\d{6}\s*)(,\s*\d{6}\s*)*,?\s*$

它仅适用于六位数字,您必须输入至少一个 6 位数字。 如果您有一个带有空格的尾随逗号,它也可以工作。

【讨论】:

  • 这将匹配:123456 123456,因为逗号是可选的。
  • @nickb 是正确的,它甚至会匹配 123456123456,因为空格也是可选的。
  • 我选择了这个版本,因为它是我测试的第一个版本,它符合我的所有标准。接受数字之间的一个逗号(不是 2)并允许空格。并且开头没有逗号。所以它很完美。我没有尝试其他的,所以它们可能工作得很好,但这是第一个有效的。感谢@jesko 和所有回复。
【解决方案3】:

它接受超过六位数的数字,因为您没有锚定文本,并且出于某种奇怪的原因,您可以选择重复逗号。试试这样的:

^[0-9]{6}(?:\s*,\s*[0-9]{6})*$

还要注意[0-9] 等价于\d,因此可以更简洁地改写为:

^\d{6}(?:\s*,\s*\d{6})*$

【讨论】:

  • 如果开头或结尾有空格会失败。
  • @JustinMorgan - 是的,由 OP 来修剪前导/尾随空格,或在锚点后添加 \s*。也就是说,当然,如果空格是一个问题,这基于 OP 是模棱两可的。
  • 是的,我认为这是一个错误,但他并不清楚。很公平,我已经删除了反对票,以便让您免于怀疑。
【解决方案4】:

您的正则表达式不匹配连续的7 数字,但它也不强制它匹配整个字符串。它只需要匹配字符串中的一些子字符串,因此它也会匹配其中的每一个:

"1234512345612345612345"
"NaNaNaN  123456,    123456 BOOO!"
"!@#$%^&*({123456})*&^%$#@!"

只需添加字符串开头 (^) 和字符串结尾 ($) 锚点,以强制整个字符串匹配并且它将正常工作:

^[0-9]{6}(\s*,*,\s*[0-9]{6})*$

另请注意,,*, 可以缩短为 ,+,如果您只想连续一个逗号,只需使用 ,,而不是 ,*,+

您也可以将[0-9] 替换为\d

^\d{6}(\s*,\s*\d{6})*$

【讨论】:

  • 如果开头或结尾有空格,这些将失败。
  • @JustinMorgan 是的!这可能是件好事,因为 OP 原来是这样写的。
  • 嗯...我认为这是一个错误,但他并不清楚。出于疑问,我将删除反对票。
【解决方案5】:

仅使用正则表达式:

var commaSeparatedSixDigits = /^(?:\d{6}\s*,\s*)*\d{6}$/;
if (myInput.test(commaSeparatedSixDigits)) console.log( "Is good!" );

这说:

  • ^ - 从字符串的开头开始
  • (?:…)* - 找到以下零个或多个:
    • \d{6} - 六位数
    • \s* - 可能是一些空格
    • , - 文字逗号
    • \s* - 可能是一些空格
  • \d{6} - 后跟六位数字
  • $ - 后跟字符串结尾

或者:

var commaSeparatedSixDigits = /^\s*\d{6}(?:\s*,\s*\d{6})*\s*$/;

我把它作为一个练习留给你来解读这有什么不同。


使用 JavaScript + 正则表达式:

function isOnlyCommaSeparatedSixDigitNumbers( str ){
  var parts = srt.split(/\s*,\s*/);
  for (var i=parts.length;i--;){
    // Ensure that each part is exactly six digit characters
    if (! /^\d{6}$/.test(parts[i])) return false;
  }
  return true;
}

【讨论】:

  • 捕获组中的\d{6} 应该在末尾,而不是开头。
  • @AaronDufour 你是对的;我刚刚编辑它(另一种方式)来解决这个问题:)
  • 如果开头或结尾有空格,您的第一个模式将失败。
  • @JustinMorgan 这是真的。此外,如果列表之前或之后有逗号。此外,如果连续有多个逗号。这些都可能是可取的,但无论哪种方式都没有由 OP 指定。
【解决方案6】:

我在这里看到了很多复杂的情况。听起来你想要的很简单:

/^(\d{6},)*\d{6}$/

然后我们考虑空格:

/^\s*(\d{6}\s*,\s*)*\d{6}\s*$/

但正如其他人所指出的,这在 JavaScript 中实际上非常简单,无需使用正则表达式:

function check(input) {
    var parts = input.split(',');
    for (var i = 0, n = parts.length; i < n; i++) {
        if (isNaN(+parts[i].trim())) {
            return false;
        }
    }
    return true;
}

在 Chrome JavaScript 控制台中测试。

【讨论】:

    【解决方案7】:

    没有任何真正需要正则表达式。将输入限制为仅 6 个字符,仅接受数字并确保输入具有 6 位数字(此处未显示)。所以你需要:

    HTML

    <input type='text' name='invoice' size='10' maxlength='6' value='' onkeypress='evNumersOnly(event);'>
    

    JavaScript

    <script>
    function evNumbersOnly( evt ) {
      //---  only accepts numbers
      //--- this handles incompatabilities between browsers
      var theEvent = evt || window.event;
      //--- this handles incompatabilities between browsers
      var key = theEvent.keyCode || theEvent.which;
      //--- convert key number to a letter
      key = String.fromCharCode( key );
      var regex = /[0-9]/;      // Allowable characters 0-9.+-,
      if( !regex.test(key) ) {
        theEvent.returnValue = false;
        //--- this prevents the character from being displayed
        if(theEvent.preventDefault) theEvent.preventDefault();
      }
    }
    </script>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-23
      • 1970-01-01
      • 2017-02-02
      相关资源
      最近更新 更多