0

我已经验证了以下情况的这个正则表达式:

正确输入:

  1. 12345678,12345678,12345678
  2. *空格*12345678、12345678、12345678、12345678
  3. 12345678,12345678,*空格*
  4. 12345678
  5. *空格*12345678,
  6. 12345678,

结果:返回 true(正则表达式在上述情况下正常工作。)

输入错误:

  1. 1234567812345678

结果:返回真(应该是假)

对于错误的输入,它应该返回 false ,但它返回 true。我应该怎么做才能验证错误的输入?

   var validate_commas = /^(\s*\d{8}\s*[,]?\s*)*$/;

谢谢

4

5 回答 5

2

请参阅描述中的歧义,以获取有关您的问题为何模棱两可以及这如何影响您获得的答案的更多详细信息。

我假设任意允许使用空格(ASCII 32):

  • 在字符串的开头
  • 在字符串的末尾
  • 逗号前后。

我假设您要禁止水平制表符、换行符、回车符和其他与 匹配的空白\s字符,并且只允许自由指定空格(ASCII 32)。

具有上述假设的 BNF 文法为:

<DIGIT>  ::= "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9"
<NUMBER> ::= <DIGIT> {8}
<SPACE>  ::= " "
<TOKEN>  ::= <SPACE>* <NUMBER> <SPACE>*
<LIST>   ::= <TOKEN> ( "," <TOKEN> )* [ "," <SPACE>* ]

有了上面的语法,就很容易写出正则解法:

var regex = /^ *\d{8} *(?:, *\d{8} *)*(?:, *)?$/;

描述不明确

如建议的那样,您应该为输入指定语法,而不是显示要匹配的字符串的示例。示例可能无法涵盖所有​​情况,回答者通常会假设“不关心”或对示例中未说明的情况做出一些假设。

于 2013-04-05T16:02:11.287 回答
0

删除可选逗号有帮助吗?

var validate_commas = /^(\s*\d{8}\s*)(,\s*\d{8}\s*)*,?$/;

如果没有更清晰的信息,这是不做更多假设就可以做到的最好的方法……例如,是否永远只有一个数字而没有逗号?

于 2013-04-05T11:03:37.500 回答
0

这应该工作

var validate_commas = /^(\s*\d{8}\s*(?:$|,\s*))*$/;

它将采用一个或多个 8 个数字字符的实例,后跟字符串结尾或另一个逗号。

或者,如果您不希望表达式匹配空行,请将最后一个量词更改为一个或多个字符:+

var validate_commas = /^(\s*\d{8}\s*(?:$|,\s*))+$/;

将在以下输入上返回true :

12345678,12345678,12345678
*space*12345678 , 12345678 , 12345678 , 12345678
12345678,12345678,*space*
12345678
*space*12345678,
12345678,

将在以下输入上返回false :

1234567812345678
sdsdsfsd
12345678, 12345678 12345678

我希望这有帮助。

于 2013-04-05T11:57:12.370 回答
0

你可以尝试这样的事情:

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

就像其他建议一样,除了它使附加数字可选,因此允许12345678,等。

于 2013-04-05T12:09:29.083 回答
-1

你的意思是逗号在数字之间不是可选的?

试试这个:

var validate_commas = /^(\s*\d{8}\s*)(,\s*\d{8}\s*)*$/;

顺便说一句,这不接受您的示例所做的空字符串。不确定你是否真的想要那个。

于 2013-04-05T11:01:57.360 回答