如何在Java中形成用户名字符串的RegEx?
练习中的规则:
"abc_._"
= false "abc..."
= false "abc__"
= true "abc.."
= true "abc_."
= true 如果我不使用正则表达式,那将更容易。
在不考虑' 1' - ' 9'的情况下,我尝试了以下RegEx,但它们无法使用。
String username_regex = "[a-zA-Z||[_||.]{0,2}]{3,10}";
String username_regex = "[a-zA-Z]{3,10}||[_||.]{0,2}";
我的功能:
public static boolean isUserNameCorrect(String user_name) {
String username_regex = "[a-zA-Z||[_]{0,2}]{3,10}";
boolean isMatch = user_name.matches(username_regex);
return isMatch;
}
我应该使用什么RegEx?
感谢您的关注。
答案 0 :(得分:2)
如果我从CS课程中记得很清楚,那么不可以创建一个单一的正则表达式以满足所有三个要求。所以,我会对每个条件进行单独检查。例如,此正则表达式检查条件1和2,并单独检查条件3。
private static final Pattern usernameRegex = Pattern.compile("[a-zA-Z1-9._]{3,10}");
public static boolean isUserNameCorrect(String userName) {
boolean isMatch = usernameRegex.matcher(userName).matches();
return isMatch && countChar(userName, '.')<=2 && countChar(userName, '_') <=2;
}
public static int countChar(String s, char c) {
int count = 0;
int index = s.indexOf(c, 0);
while ( index >= 0 ) {
count++;
index = s.indexOf(c, index+1);
}
return count;
}
BTW,请注意允许您在Java中重用正则表达式的模式(性能增益,因为编译正则表达式代价很高)。
正则表达式无法做你想做的事情(再次,如果我记得很清楚)的原因是这个问题需要一个无上下文语法,而正则表达式是一个常规语法。 Ream more
答案 1 :(得分:1)
首先,||
对于这个问题不是必需的,事实上并没有做你认为它做的事情。我之前只看到它在群组中用于正则表达式(例如,如果您想匹配Hello
或World
,则匹配(Hello|World)
或(?:Hello|World)
,在这些情况下,您只使用一个|
。
接下来,让我解释为什么你尝试的每个正则表达式都不起作用。
String username_regex = "[a-zA-Z||[_||.]{0,2}]{3,10}";
字符类中的范围运算符不会被解释为范围运算符,而只会表示构成范围运算符的文字。此外,简单地组合嵌套字符类。所以这实际上等于:
String username_regex = "[a-zA-Z_|.{0,2}]{3,10}";
所以它会匹配以下3-10个部分的组合:a
- z
,A
- Z
,0
, 2
,{
,}
,.
,|
和_
。
那不是你想要的。
String username_regex = "[a-zA-Z]{3,10}||[_||.]{0,2}";
这将匹配3到10个a
- z
或A
- Z
,后跟两个管道,然后是_
,{{1 }或|
0到2次。也不是你想要的。
执行此操作的简单方法是将需求分为两部分,并根据这些部分创建两个正则表达式字符串:
第一个要求非常简单:我们只需要创建一个包含所有有效字符的字符类,并对可以显示的字符数量进行限制:
.
然后我会验证&#39; _&#39;和&#39;。&#39;出现0到2次:
"[a-zA-Z1-9_.]{3,10}"
或
".*[._].*[._].*"
遗憾的是,我没有足够的经验来弄清楚单个正则表达式会是什么样子......但这些至少是可读的。
答案 2 :(得分:0)
请试试这个: [[A-Z] [0-9]的 [._] [[A-Z] [0-9] [._] [[A-Z] [0-9] *
尼科
编辑: 你是对的。然后几个正则表达式: Regex1:^ [\ w。] {3-10} $ Regex2:^ [[aZ] [0-9]] [_。]?[[aZ] [0-9]] [_。]?[[aZ] [0-9]] * $
我希望我什么也没忘记!
答案 3 :(得分:0)
可能不太优雅,但你可以试试这个:
^(([A-Za-z0-9\._])(?!.*[\._].*[\._].*[\._])){3,10}$
以下是解释:
NODE EXPLANATION
--------------------------------------------------------------------------------
^ the beginning of the string
--------------------------------------------------------------------------------
( group and capture to \1 (between 3 and 10
times (matching the most amount
possible)):
--------------------------------------------------------------------------------
( group and capture to \2:
--------------------------------------------------------------------------------
[A-Za-z0-9\._] any character of: 'A' to 'Z', 'a' to
'z', '0' to '9', '\.', '_'
--------------------------------------------------------------------------------
) end of \2
--------------------------------------------------------------------------------
(?! look ahead to see if there is not:
--------------------------------------------------------------------------------
.* any character except \n (0 or more
times (matching the most amount
possible))
--------------------------------------------------------------------------------
[\._] any character of: '\.', '_'
--------------------------------------------------------------------------------
.* any character except \n (0 or more
times (matching the most amount
possible))
--------------------------------------------------------------------------------
[\._] any character of: '\.', '_'
--------------------------------------------------------------------------------
.* any character except \n (0 or more
times (matching the most amount
possible))
--------------------------------------------------------------------------------
[\._] any character of: '\.', '_'
--------------------------------------------------------------------------------
) end of look-ahead
--------------------------------------------------------------------------------
){3,10} end of \1 (NOTE: because you are using a
quantifier on this capture, only the LAST
repetition of the captured pattern will be
stored in \1)
--------------------------------------------------------------------------------
$ before an optional \n, and the end of the
string
这将满足您的上述要求。希望它有所帮助:)