如何创建一个JavaScript正则表达式来匹配长度和多个约束?
我需要构建具有以下约束的JavaScript正则表达式:如何创建一个JavaScript正则表达式来匹配长度和多个约束?,javascript,regex,Javascript,Regex,我需要构建具有以下约束的JavaScript正则表达式: 输入字符串的长度必须至少为6个字符 输入字符串需要至少包含1个字母字符 输入字符串需要至少包含1个非字母字符 我严重缺乏JavaScript中的回溯功能。我想到的是: ((([a-zA-Z][^a-zA-Z])|([^a-zA-Z][a-zA-Z]))....)| (.(([a-zA-Z][^a-zA-Z])|([^a-zA-Z][a-zA-Z]))...)| (..(([a-zA-Z][^a-zA-Z])|([^a-zA-Z][a-
- 输入字符串的长度必须至少为6个字符
- 输入字符串需要至少包含1个字母字符
- 输入字符串需要至少包含1个非字母字符
((([a-zA-Z][^a-zA-Z])|([^a-zA-Z][a-zA-Z]))....)|
(.(([a-zA-Z][^a-zA-Z])|([^a-zA-Z][a-zA-Z]))...)|
(..(([a-zA-Z][^a-zA-Z])|([^a-zA-Z][a-zA-Z]))..)|
(...(([a-zA-Z][^a-zA-Z])|([^a-zA-Z][a-zA-Z])).)|
(....(([a-zA-Z][^a-zA-Z])|([^a-zA-Z][a-zA-Z])))
这看起来很长。有更好的方法吗?
我是如何做到这一点的:
[a-zA-Z]
[^a-zA-Z]
[a-zA-Z][^a-zA-Z]
或[^a-zA-Z][a-zA-Z]
So
(([a-zA-Z][^a-zA-Z])([^a-zA-Z][a-zA-Z])
^
-字符串的开头(?=…)
-后跟(即独立的子匹配;它不会移动当前匹配位置){6}
-六个字符(“字符串开头加六个字符”实现“长度必须至少为六个字符”规则)*
-0个或更多字符(换行符除外-可能需要修复此问题?)[a-zA-Z]
-字母(*[a-zA-Z]
因此会在任何位置查找包含字母的字符串(从技术上讲,它会查找其中的最后一个字母))[^a-zA-Z]
-非字母字符
总之:从字符串的开头开始,我们尝试依次匹配以下各项:
- 6个字符(如果我们找到这些字符,字符串长度必须为6个字符(或更多))
- 后跟字母的任意字符串
- 后跟非字母的任意字符串
- 使用此正则表达式
/^(?=.{6,})(?=.*[a-zA-Z])(?=.*[^a-zA-Z]).*$/
-------- ------------- --------------
^ ^ ^
| | |->checks for a single non-alphabet
| |->checks for a single alphabet
|->checks for 6 to many characters
(?=)
是一种零宽度
前瞻,它检查是否匹配。它不消耗字符。这就是为什么我们可以使用多个背对背的查找类似于其他查找的答案,因此这不需要太多解释,我认为最好的方法是这样做
/^(?=.*[a-zA-Z])(?=.*[^a-zA-Z]).{6,}$/
这从字符串的开头开始,查找字母字符,查找非字母字符,最后,它找到了一个6个以上字符的字符串,我认为没有必要查找长度的首字母对不起,我是一个正则表达式noob:是否需要开始时的
^
?你能解释一下你的正则表达式吗?@dystroy,从技术上讲,不是。但这是一个优化:如果正则表达式引擎不是很聪明,它将不得不在输入字符串的每个位置重复检查。否则,这就没有什么可匹配的了,看看-aheads@Some1.Kill.The.DJ由于结尾没有美元,我认为{6}没有问题。该组不必匹配整个字符串。你能解释一下你的正则表达式吗?@KeesC.Bakker(?=)
看起来确实不错,你总是可以对检查进行重新排序,并在最后一个检查前后删除(?=)
。这不仅仅是重新排序,而是删除冗余检查并获得匹配字符串。仅使用lookaheads不会输出匹配字符串,即使输入字符串匹配。好的,您也可以始终将*$
添加到正则表达式中,这实际上就是您所做的:1)/^(?=.{6}(?=.[a-zA-Z])(?=.[^a-zA-Z])(?=.[^a-zA-Z])。$/
2)重新排序:/^-.[[a-zA-Z])(?=.[^a-zA-Z])(?=.[^a-zA-Z])(?=.[^a-zA-Z])(?=.*/.-/.[[a-zA]。](?=.[^a-zA-Z]){6}.$/
4)熔丝:/^(?=.[^a-zA-Z])(?=.[^a-zA-Z])。{6,}$/
如果跳过第2步,你会得到/^(?=.{6})(?=.[a-zA-Z]).[^a-zA-Z].$/
,这同样有效。对不起,我不清楚。我回答这个问题的初衷是要把整个字符串匹配起来。我做到了。还有@Some1.Kill.The.DJ这样做了,但我认为检查字符串长度的先行检查是无用的,可以轻松地与字符串匹配本身连接,从而产生两个lookahead,而不是三个lookahead,我认为(可能会被反驳)会产生稍微更好的性能。你为什么不接受任何答案。还有问题吗?我总是给人们一个参与讨论的机会。
/^(?=.*[a-zA-Z])(?=.*[^a-zA-Z]).{6,}$/