我有一个用户名字符串,它可以包含(句点).
(下划线)_
。但我不希望字符串有多于1个重复.
或_
。例如:
alpha.beta.gamma
和alpha.beta_gamma
可接受。
alpha..beta
,alpha__beta
和alpha._beta
等无法接受。
以下是我正在使用的正则表达式".*([._])\\1{1,}.*"
它适用于相同的字符,因此它会为true
和alpha..beta
返回alpha__beta
。但是,正则表达式会为false
返回alpha._beta
。
如何修改正则表达式以使其适用于.
和_
重复匹配?
答案 0 :(得分:4)
使用此:.*([._]){2,}.*
答案 1 :(得分:2)
通过确保用户名与不需要的格式不匹配,以下应该可以解决问题:
// should not match this
/.*[._]{2,}.*/
这样可以确保_
或.
中只有一个可以连续出现。
您可能还需要考虑比.*
更具体,可能类似于[A-Za-z0-9]*
。
答案 2 :(得分:2)
回想一下,在RegEx中,组和*
/ +
运算符可以任意嵌套。
这里匹配所有以某些字符开头的字符串,然后是任意多个块,其中每个块以'。'开头。或者是'_'并以任意多个字符结尾。
“[1 - ZA-Z] +([._] [A-ZA-Z] +)*”
示例(使用Scala,但这是无关紧要的,它是相同的字符串文字,以及相同的java.util.regex库):
for (example <- List(
"aa.bb_c", "aa_.bb", "abc..cb", "a.b.c_d",
"uidh.dh_thh.ths", "_a", "a_", "a_b_c",
"tdh_ins_utu", "ghs.tah..hua",
"kqkz..wkmqjk", ".wkqj", "..wkqm")
) println(
("'" + example + "' : ").padTo(20, ' ') +
example.matches("[a-zA-Z]+([._][a-zA-Z]+)*")
)
输出:
'aa.bb_c' : true
'aa_.bb' : false
'abc..cb' : false
'a.b.c_d' : true
'uidh.dh_thh.ths' : true
'_a' : false
'a_' : false
'a_b_c' : true
'tdh_ins_utu' : true
'ghs.tah..hua' : false
'kqkz..wkmqjk' : false
'.wkqj' : false
'..wkqm' : false
答案 3 :(得分:0)
另一种非正则表达方式只是检查if(s.contains...)
和您的4个选项(..
,__
,._
,{{1}的简单方法});
_.