Javascript 是否可以使用正则表达式对字符串进行连续验证 我试图对一个包含一个特殊字符的字符串进行中间验证。连续验证意味着即使是部分字符串也应该返回true

Javascript 是否可以使用正则表达式对字符串进行连续验证 我试图对一个包含一个特殊字符的字符串进行中间验证。连续验证意味着即使是部分字符串也应该返回true,javascript,regex,Javascript,Regex,以[四位数字][连字符][三个字母数字]这样的字符串为例 案例 1) 1应验证 2) 432应验证 3) 1234-应验证 4) 1q21-不应验证 5) 4532-a3s应进行验证 6) 8023-as12不应验证 我现在的正则表达式是 /^([0-9]{1,4})?\-([a-zA-Z0-9]{1,3})?$/; 这不会验证上面清单中的案例1和案例2 它确实验证了上述案例中的案例3、4、5、6如果您不需要,可以将第一个组设置为非可选,后面是可选的连字符,并将该组设置为非捕获。如果您也只想匹

以[四位数字][连字符][三个字母数字]这样的字符串为例

案例
1) 1应验证
2) 432应验证
3) 1234-应验证
4) 1q21-不应验证
5) 4532-a3s应进行验证
6) 8023-as12不应验证

我现在的正则表达式是

/^([0-9]{1,4})?\-([a-zA-Z0-9]{1,3})?$/;
这不会验证上面清单中的案例1和案例2


它确实验证了上述案例中的案例3、4、5、6

如果您不需要,可以将第一个组设置为非可选,后面是可选的连字符,并将该组设置为非捕获。如果您也只想匹配数字,可以使用替换

^(?:\d+|[0-9]{4}-?(?:[a-zA-Z0-9]{1,3})?)$
  • ^
    字符串的开头
  • (?:
    非捕获组
    • \d+
      匹配1+个数字
    • |
    • [0-9]{4}-?
      将4位数字与可选的
      -
    • (?:
      非捕获组
      • [a-zA-Z0-9]{1,3}
        匹配字符类中列出的任何字符1-3次
    • )?
      关闭组并将其设置为可选
  • 关闭非捕获组
  • $
    字符串结尾

如果允许的数字不超过4位,并且连字符应位于第二部分,则您也可以使用:

^(?:\d{1,4}(?:-[a-zA-Z0-9]{0,3})?|\d{4})$
你可以试试

^(\d{1,3}|\d{4}(-[a-z0-9]{0,3})?)$

(包括解释)

这不是正则表达式特别擅长的,但是

^(?:\d{1,3}|\d{4}(?:-([a-zA-Z0-9]{0,3}))?)$

您必须以增量方式构建部件,满意的部件是完全声明和强制的,不满意的部件是可选的。

我将使用简单的javascript来解决这个问题。循环遍历每个字符,检查它们位于哪个索引范围内,并相应地应用验证

函数验证字符串(str){
如果(str.length>8 | | str.length==0)返回false;
对于(变量i=0;i='0'&&str.charAt(i)='0'&&str.charAt(i)='a'&&str.charAt(i)='a'&&str.charAt(i)='a'&&str.charAt(i){
console.log(值+“=>”+validateString(值));

})
一些技巧可能是只为完整版本使用正则表达式,比如:

/^\d{4}-[a-zA-Z0-9]{1,3}$/
有一个完全正确的模式:

"1234-aA0"
并在正则表达式检查之前使用正确的模式完成用户输入:

const detect=函数(用户输入){
如果(userInput.length>8)返回false
const regex=/^\d{4}-[a-zA-Z0-9]{1,3}$/
const pattern=“1234-aA0”
返回regex.test(userInput+pattern.slice(userInput.length))
}
常量测试=['1'、'432'、'1234-'、'1q21-'、'4532-a3s'、'8023-as12'、'1-2a'、'1234ab'、'1-a'、'5555555'、'5555QQ'、'1234-#
测试。forEach((值)=>{
console.log(值+“=>”+检测(值));

})
感谢您的输入..对于案例3,情况并非如此,并且验证了12d之类的字符串,这是不应该的..您的更新改进了验证..谢谢..但它也验证了1b2、1df3之类的字符串,这是不应该的,因为前四个字符串也包含字母表您对regex101的更新工作正常..谢谢..如果您可以在此处更新有人可以将您的答案标记为已接受答案这将匹配
555555555
(无限位数)和
5555qq
(无连字符)@Amadan我明白了,我在答案中添加了另一个模式,以防这是要求。
1-2a
be
true
?我认为它应该给出
false
will
1234ab
match?@第四鸟谢谢你指出,更新了!(无论如何,op没有提到这一点)这将匹配<代码> 1-A,并且将不匹配<代码> 1234 -<代码>。这是模式的错误实现——在第四个位置中,您只考虑“代码> -/CODE”,而它可能出现在第二或第三个,这取决于前面的数字量。通常,您还正确地考虑长度<代码> 8 < /代码>的输入。为了有效性。从技术上讲,代码没有明确说明,但在长度上,比如说,7位置检查非常严格,
123-a3s
模式将失败。
1234-a3
模式将成功,但长度为7时,存在假阴性。@VLAZ OP要求
[四位数字][连字符][三个字母数字]
。我同意你的说法,你说这是非常严格的。好吧,显然接受的答案被改变了。我猜要求真的是“只有四位数”。鉴于此,我承认要求不明确。@VLAZ,OP指定了这种格式
[四位数][连字符][三个字母数字]
。因此,我假设如果连字符出现,它必须出现在第四位,而不是在第四位之前或之后。@vivek_23非常混乱,事实上,现在我重新检查了它。有效/无效案例列表根本没有澄清像
1-a
这样的东西。