如何为包含一颗或两颗星的字母数字字符编写正则表达式,并将总字符串长度限制为3。
Ex:以下字符串长度为3
*12 or *2* 0r *a* or *B* or **2
因此,*
符号可以出现在*12
的最后或中间或第一位。同样,如果您使用最后一个示例**2
,您会看到多个*
符号,并且可以按该字符串的任何顺序发生。
答案 0 :(得分: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个星号,则可以很好地扩展。
示例:
除了字符串的开头/结尾之外no delimeters :
/
^
(?= [a-z0-9*]{3} $ )
(?:[a-z0-9]*\*){1,2} [a-z0-9]*
$
/xi
delimeter是 \ s ,上下文是单行和全局的。数据在第1组中捕获
/
(?:^|\s)
(?= [a-z0-9*]{3} (?:$|\s) )
( (?:[a-z0-9]*\*){1,2} [a-z0-9]* )
(?=$|\s)
/xig
delimeter是 [^ 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
答案 1 :(得分:1)
此正则表达式适用于lookbehind。我已经在codepad here中使用PHP测试了它。
(?<![\w*])(\w(?!\w\w)|\*(?!\*\*)){3}(?![\w*])
它基本上寻找一个没有三个单词字符或三个明星字符的三个字符的单词。 (?<![\w*])
删除单词字符或*后面的单词,(?![\w*])
删除单词前面的单词(因此只返回三个字符的单词段)。
Javascript并不具备外观,所以我尝试使用here使用的技术。然后我想出了以下正则表达式,在jsfiddle here中进行了测试。
/(?![\w*])(.?)(\w(?!\w\w)|\*(?!\*\*)){3}(?![\w*])/g
希望这会有所帮助!!!!!!!! &lt; - 正则表达式让我有点疯狂
答案 2 :(得分:0)
这个怎么样:
[a-zA-Z0-9*]{2}[^*]|[a-zA-Z0-9*][^*][a-zA-Z0-9*]|[^*][a-zA-Z0-9*]{2}
答案 3 :(得分:0)
编辑:对于没有逗号和可选空格的更新问题:
/^(\*[A-Z0-9]{2}|\*[A-Z0-9]\*|\*\*[A-Z0-9])$/i
您的示例首先不包括字母数字字符,例如A**
,但如果您需要,我确信您可以从我已经提供的内容中找到它。
(见下面对混合案例的评论)
我原来的回答:
/^(\*[A-Z0-9]{2}|\*[A-Z0-9]\*|\*\*[A-Z0-9])(, *(\*[A-Z0-9]{2}|\*[A-Z0-9]\*|\*\*[A-Z0-9]))*$/i
这是带有“i”选项的JavaScript语法,使其不区分大小写。对于不区分大小写的匹配,我无法查找Java等效项,但如有必要,您可以随时将每个[A-Z0-9]
部分更改为[A-Za-z0-9]
。
如果您扩展“字母数字”的定义以包含下划线,则可以使用\w
代替[A-Za-z0-9]
。
答案 4 :(得分:0)
有三种情况:
\w[*\w]{2} # case 1, string begins with word character, last 2 can be stars
\*\w[*\w] # case 2, string begins with 1 star, last can be a star
\*{2}\w # case 3, string begins with 2 stars, last cannot be a star
合在一起,并添加必要的字符串断言的开始和结束,我们得到:
^(\w[*\w]{2}|\*\w[*\w]|\*{2}\w)$
但是这个解决方案并不完全正确,因为\w
字符类不仅允许使用字母数字,还允许使用_
字符。因此,我们将括号中的字符类[a-zA-Z0-9]
替换为\w
并获取:
^([a-zA-Z0-9][*a-zA-Z0-9]{2}|\*[a-zA-Z0-9][*a-zA-Z0-9]|\*{2}[a-zA-Z0-9])$