如何为字母数字字符编写正则表达式,允许一个或两个星号并将字符串总长度限制为 3。
例如:下面的字符串长度为 3
*12 or *2* 0r *a* or *B* or **2
因此,*
符号可以出现在 *12
的最后、中间或第一个。同样,如果您采用最后一个示例 **2
,您会看到多个 *
符号,并且可以以该字符串的任何顺序出现。
最佳答案
您始终可以在 JavaScript 中使用前瞻断言。它有点棘手,但它更适合微调任何特定的排列。
/^(?=(?:[^*]*\*){1,2}[^*]*$)[a-zA-Z0-9*]{3}$/
扩展:
^ # beginning of line
(?= # start lookahead
(?: # non-capture group
[^*]* # optional not '*' characters
\* # '*' character
){1,2} # end group, do 1 or 2 times
[^*]* # optional not '*' characters
$ # end of line
) # end lookahead
[a-zA-Z0-9*]{3} # back at begining of line. at this point there will
# be only 1 or 2 '*' characters in the line.
# match exactly 3 of alphanumeric characters or '*'
$ # end of line
替换您需要的任何要求。
下面是一个perl测试用例,javascript不是我的强项。
@samps = qw(
*12 1*2 12* **1 *1* 1** ***
a*12 a1*2 a12* **a1 *a1* a1** ****
*2 *2 2* *1 1* **
);
for $teststr (@samps) {
if ($teststr =~ /^(?=(?:[^*]*\*){1,2}[^*]*$)[a-zA-Z0-9*]{3}$/) {
print "$teststr passed\n";
}
else {
print "$teststr failed\n";
}
}
输出:
*12 passed
1*2 passed
12* passed
**1 passed
*1* passed
1** passed
*** failed
a*12 failed
a1*2 failed
a12* failed
**a1 failed
*a1* failed
a1** failed
**** failed
*2 failed
*2 failed
2* failed
*1 failed
1* failed
** failed
编辑@bozdoz
我没有意识到一个字符串可能会被多次删除。如果是这样,则可以将正则表达式推广为带/不带分隔符使用。
重要的是,如果要求更改为(例如总共 8 个字符且只有 2-4 个星号),这可以很好地扩展。
示例:
除了字符串的开始/结束之外没有分隔符:
/
^
(?= [a-z0-9*]{3} $ )
(?:[a-z0-9]*\*){1,2} [a-z0-9]*
$
/xi
分隔符为\s,上下文是单行且全局的。数据在组 1 中捕获
/
(?:^|\s)
(?= [a-z0-9*]{3} (?:$|\s) )
( (?:[a-z0-9]*\*){1,2} [a-z0-9]* )
(?=$|\s)
/xig
分隔符为[^a-z0-9*],上下文是单行且全局的。数据在组 1 中捕获
/
(?:^|[^a-z0-9*])
(?= [a-z0-9*]{3} (?:$|[^a-z0-9*]) )
( (?:[a-z0-9]*\*){1,2} [a-z0-9]* )
(?=$|[^a-z0-9*])
/xig
关于java - 正则表达式匹配字母数字字符和一个 *,总长度应为 3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8291161/