繁体   English   中英

正则表达式检查字符串中是否重复字符

[英]Regex to check for repeating characters inside a string

我有一个用于username的字符串,它可以包含(period) . (下划线) _ 但是我不希望字符串重复超过1个. _ 因此,例如:

alpha.beta.gammaalpha.beta_gamma可以接受的

alpha..betaalpha__betaalpha._beta等是不可接受的

这是我使用的正则表达式".*([._])\\\\1{1,}.*"

它适用于相同的字符,因此对于alpha..betaalpha__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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM