Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/sharepoint/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 用破折号分隔的正则表达式3编号部分_Javascript_Regex - Fatal编程技术网

Javascript 用破折号分隔的正则表达式3编号部分

Javascript 用破折号分隔的正则表达式3编号部分,javascript,regex,Javascript,Regex,我想用JavaScript为字符串创建一个RegExp验证,它可以有3个部分: P1-P2-P3 根据以下规则: P1、P2和P3只能是数字 每个零件的长度可以是1-13位 整个字符串不能超过20个字符 P2和P3部分是可选的(表示34已经是有效字符串,或34-6565或566-233455-23232) 目前我有这个,但我缺少整个字符串长度,我不知道如何定义可选部分: /^.\d{1,13}-\d{1,13}-\d{1,13}$/ 这里有几个有效的条目:565633434-2323-4

我想用JavaScript为字符串创建一个RegExp验证,它可以有3个部分:

P1-P2-P3
根据以下规则:

  • P1、P2和P3只能是数字
  • 每个零件的长度可以是1-13位
  • 整个字符串不能超过20个字符
  • P2和P3部分是可选的(表示
    34
    已经是有效字符串,或
    34-6565
    566-233455-23232
目前我有这个,但我缺少整个字符串长度,我不知道如何定义可选部分:

/^.\d{1,13}-\d{1,13}-\d{1,13}$/
这里有几个有效的条目:565633434-2323-45,12-4345-1234567890123-1234561234567890123-12-56

无效条目:344534543512345667787、123456780123-123456780123、234555-233-123-3434、34sd1322-23、31234as等

 /(^\d{1,13}(-\d{1,13})?(-\d{1,13})?$){1,20}/
表示其中的0或1,因此这对于可选零件很有用

{1,20}
在整个字符串的末尾检查长度是否不超过20。

您可以使用:

^(?=\d{1,13}(-\d{1,13}){0,2}$)[\d-]{1,20}$
在线演示: 说明:

(?!.{21,})
开头-负前瞻含义:不超过20个字符

(\d{1,13}-){0,2}(\d{1,13})
匹配两组长度不超过13位的数字,后跟破折号,然后匹配一组长度不超过13位的数字。这种方法是可扩展的,因为您只需在第一个捕获组之后更改数量,即可更改所需的部件数量。我建议您在验证正则表达式之前,通过代码检查字符串的长度是否合适。它会更快,可读性更强

例如:


您也可以通过Javascript实现这一点,速度可能会更快:

总字符串长度检查必须分开;其余部分可以使用正则表达式完成:

var re = /^\d{1,13}(?:\-\d{1,13}){0,2}$/;

if (str.length <= 20 && str.match(re)) {
    // valid
}
var re=/^\d{1,13}(?:\-\d{1,13}){0,2}$/;
如果(str.length试试这个:

/^(?=.{0,20}$)\d{1,13}(-\d{1,13}){0,2}$/
说明:

^输入的开头
(?=.{0,20}$)后跟任意字符,0或20次,+输入结束
\d{1,13}一个数字,1或13次
(-d{1,13}{0,2}一个破折号+同上,0或2次
$输入结束

关于正则表达式的更多信息:。

为什么开始是
呢?只是好奇..这也表明对像
d345
@Mr_Green这样的数字是有效的,问题是:)你说得对,@Mr_Green,它在OP中,被删除了。-1。因为它匹配的是
'1234567890-1234567890-1234567890'
(太长)。它匹配的字符串长度超过20个字符。根据您的问题,示例
344534543512345667787中的此字符串无效。它是有效的。它有20位长?@PrimozRome您最好通过javascript字符串操作来实现这一点。这是可以理解的,性能也很好。@ojovirtual您是对的,它无效,因为P1比13个字符长。。。对不起,我弄错了,我已经修改了这个问题。@primozarome您不能在正则表达式中检查字符串长度,至少不容易least@PrimozRome:实际上我做了一个更新,现在它不会接受任何超过13个长度的内容。现在解释一下,不要看regex101。一个普通的Javascript会更具可读性。@Kroltan:Lookaheads功能非常强大,这个正则表达式很容易理解,它可以分为Lookaheads内部的内容和外部匹配的内容。
[\d-]{1,20}
。这个解释是一个笑话,你不妨删除它。
/^(?=.{0,20}$)\d{1,13}(-\d{1,13}){0,2}$/