[英]Regex to check for repeating characters inside a string
我有一个用于username的字符串,它可以包含(period) .
(下划线) _
。 但是我不希望字符串重复超过1个.
或_
。 因此,例如:
alpha.beta.gamma
和alpha.beta_gamma
是可以接受的 。
alpha..beta
, alpha__beta
和alpha._beta
等是不可接受的 。
这是我使用的正则表达式".*([._])\\\\1{1,}.*"
它适用于相同的字符,因此对于alpha..beta
和alpha__beta
返回true
。 但是,正则表达式为alpha._beta
返回false
。
我该如何修改正则表达式以使其同时适用于两者.
和_
重复比赛?
使用这个: .*([._]){2,}.*
通过确保用户名与不希望的格式不匹配,以下方法可以解决问题:
// should not match this
/.*[._]{2,}.*/
这将确保_
或最多一个.
可以连续出现。
您可能还想考虑比.*
更具体,可能类似于[A-Za-z0-9]*
。
回想一下,在RegEx中,组和*
/ +
运算符可以任意嵌套。
这里匹配所有以某些字符开头的字符串,然后是任意多个块,每个块以“。”开头。 或“ _”并以任意多个字符结尾。
“ [[a-zA-Z] +([._] [a-zA-Z] +)*”
示例(使用Scala,但这无关紧要,它是相同的String文字和相同的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
另一种非正则表达式方式只是检查if(s.contains...)
和您的4个选项( ..
, __
, ._
, _.
)的简单方法。
return !(s.contains("..") || s.contains("__") || s.contains("._") || s.contains("_."));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.