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

时间:2018-01-29 21:49:05

标签: java regex

我有一个用户名字符串,它可以包含(句点).(下划线)_。但我不希望字符串有多于1个重复._。例如:

alpha.beta.gammaalpha.beta_gamma 可接受

alpha..betaalpha__betaalpha._beta无法接受

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

它适用于相同的字符,因此它会为truealpha..beta返回alpha__beta。但是,正则表达式会为false返回alpha._beta

如何修改正则表达式以使其适用于._重复匹配?

4 个答案:

答案 0 :(得分:4)

使用此:.*([._]){2,}.*

see Demo

答案 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}的简单方法});

_.