JavaScript正则表达式测试仅限6位数字。逗号分隔。

3

因此这必须通过:

454555, 939999 , 019999    ,727663

这是针对输入6位发票号码的用户。如果数字为5位或7位而不是6位,则应该失败。因此,1234567, 123456应该失败,因为其中一个组合超过了6个数字。

目前为止,我有:

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

唯一的缺点是它只接受7位或更多位数字。目前还不确定是否可能同时测试用逗号和一个或多个空格分隔的6位数字,并且所有数字必须仅为6位,并在有任何不是6位数字时失败。

非常感谢您的帮助,正则表达式不是我的强项。

谢谢

Norman


如果只输入一个数字也应该能通过:333222 - Norman Bird
你尝试过在末尾添加锚点“^”和“$”吗? - Rohit Jain
@mvw 那个很好用;我建议你删除误导性的评论。 - Phrogz
你的正则表达式中有 ,*;你真的想允许 123456,,,,,123456 作为有效输入吗?那么仅包含空格的输入,例如 123456 123456,是否也是有效的? - Phrogz
7个回答

6
您可以像下面的函数一样使用正则表达式来编写它。
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);
  });

你要回答什么问题?他们想匹配一个以逗号分隔的数字列表 - Toto

2
你的正则表达式没有匹配连续的七个数字,但它也没有强制要求匹配整个字符串。它只需要在字符串中匹配某些子串,因此它也会匹配以下每个内容:
"1234512345612345612345"
"NaNaNaN  123456,    123456 BOOO!"
"!@#$%^&*({123456})*&^%$#@!"

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

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

还要注意,,*, 可以缩写为 ,+,如果你只想要一行中的一个逗号,只需使用 , 而不是 ,*,+

你还可以用 \d 替换 [0-9]

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

如果开头或结尾有空格,这些操作将失败。 - Justin Morgan
@JustinMorgan 是的!这可能是一件好事,因为原始帖子中就是那样写的。 - Paul
嗯...我认为那是一个错误,但他表达得不清楚。为了给予怀疑的好处,我会取消踩的评价。 - Justin Morgan

2

之所以可以输入超过六位数字,是因为你没有锚定文本,并且出于某种奇怪的原因,你选择性地重复了逗号。尝试使用以下代码:

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

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

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

如果开头或结尾有空格,这将失败。 - Justin Morgan
@JustinMorgan - 是的,这取决于原帖发布者是要修剪前导/尾随空格还是在锚点后添加\s*。当然,这只有在空格是问题的情况下才会产生歧义,而这取决于原帖发布者。 - nickb
是的,我认为那是一个错误,但他表达得不清楚。好吧,我取消了踩一下来给你以怀疑的机会。 - Justin Morgan

2

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

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

此功能仅支持六位数字,您至少需要输入一个六位数。如果有尾随逗号和空格,也可以使用此功能。


1
这将匹配: 123456 123456,因为逗号是可选的。 - nickb
@nickb 是正确的,它甚至可以匹配 123456123456,因为空格也是可选的。 - Justin Morgan
我选择了这个版本,因为它是我测试的第一个版本,并且符合我所有的标准。它允许数字之间有一个逗号(而不是两个),并且允许空格,但开头不能有逗号。所以它非常完美。我没有尝试其他版本,所以它们可能也很好用,但这个版本是第一个可以使用的。感谢@jesko和所有回复我的人。 - Norman Bird

0

仅使用正则表达式:

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}应该在末尾而不是开头。 - Aaron Dufour
@AaronDufour 你说的对,我刚刚编辑了它(另一种方式)来修复那个问题 :) - Phrogz
如果在开头或结尾有空格,你的第一个模式将失败。 - Justin Morgan
@JustinMorgan 这是正确的。如果列表之前或之后有逗号,或者连续出现多个逗号,这些都可能是需要的,但OP没有明确说明。 - Phrogz

0

实际上并不需要正则表达式。将输入限制为仅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>

0

我在这里看到了很多复杂性。对我来说,你想要的似乎非常简单:

/^(\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 控制台中测试。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接