3

and so this must pass:

454555, 939999 , 019999    ,727663

its for a user entering 6 digit invoice numbers. it should fail if a number is 5 or 7 digit and not 6. so 1234567, 123456 should fail, as one set is more than 6 numbers.

So far I have :

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

which only draw back is that it accepts 7 or more digit numbers. cant figure out if its even possible at this point to do both, test for 6 digits separated by a comma and one or more space, and all the digits have to be only 6 digits and fail if one is not.

any help appreciated. regular expressions are not my forte.

thanks

Norman

4

7 回答 7

5

您可以使用正则表达式编写它,如下面的函数。

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);
  });
于 2020-03-30T11:31:51.083 回答
2

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

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

另请注意,[0-9]它等价于\d,因此可以更简洁地重写为:

^\d{6}(?:\s*,\s*\d{6})*$
于 2013-08-30T15:22:17.783 回答
2

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

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

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

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

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

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

^\d{6}(\s*,\s*\d{6})*$
于 2013-08-30T15:23:22.437 回答
2

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

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

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

于 2013-08-30T15:25:11.493 回答
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 控制台中测试。

于 2013-08-30T15:44:05.597 回答
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;
}
于 2013-08-30T15:20:28.160 回答
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>
于 2013-08-30T15:26:59.570 回答