我有一个类似的验证,字符串应至少包含一个字母或数字。它可能包含_或 - 作为两者之间的可选字符。字符串应以字母或数字开头和结尾。我尝试使用很多正则表达式,但我无法做到这一点。这是我的RegEx代码:
public static boolean isValidURL(String inputString) {
try {
boolean isValid = true;
Pattern letter = Pattern.compile("[a-zA-z0-9]");
String restPattern = "^[a-zA-Z0-9]+[a-zA-Z0-9_\\-\\s]?[a-zA-Z0-9]+$";
Matcher hasLetter = letter.matcher(inputString);
if (hasLetter.find()) {
if (inputString.matches(restPattern)) {
isValid = true;
} else {
isValid = false;
}
} else {
isValid = false;
}
return isValid;
} catch (Exception e) {
throw e;
}
}
和我的单元测试:
assertEquals(true, Validator.isValidURL("res"));
assertEquals(true, Validator.isValidURL("res_rer"));
assertEquals(true, Validator.isValidURL("res-rer"));
assertEquals(true, Validator.isValidURL("res232A"));
assertEquals(true, Validator.isValidURL("232DFA"));
assertEquals(true, Validator.isValidURL("23_323"));
assertEquals(true, Validator.isValidURL("23"));
assertEquals(true, Validator.isValidURL("A2s"));
assertEquals(false, Validator.isValidURL("_"));
assertEquals(false, Validator.isValidURL("-"));
assertEquals(false, Validator.isValidURL("@"));
assertEquals(false, Validator.isValidURL("@GR$"));
assertEquals(false, Validator.isValidURL("_GR_"));
assertEquals(false, Validator.isValidURL("GR_"));
assertEquals(false, Validator.isValidURL("GR_"));
assertEquals(true, Validator.isValidURL("s"));
assertEquals(true, Validator.isValidURL("4"));
最后两个断言失败。请帮我解决这个问题。
答案 0 :(得分:4)
以下正则表达式允许使用一个或多个字母数字字符,并允许在字母数字字符之间使用-
或_
,但不允许在第一个或最后一个字符。
^[a-zA-Z0-9]+(?:[-_]+[a-zA-Z0-9]+)*$
如果您不想要连续的_
或-
,请删除非捕获组中存在的字符类之后的+
。
^[a-zA-Z0-9]+(?:[-_][a-zA-Z0-9]+)*$
答案 1 :(得分:2)
这应该将输入限制为以字母数字开头和结尾,并允许输入中连续多个-
和_
。
^[a-zA-Z0-9]++(?:[-_]++[a-zA-Z0-9]++)*+$
我将所有量词都占有欲(++
和*+
而不是+
和*
),以禁止回溯。
答案 2 :(得分:0)
^([a-zA-Z0-9]+[a-zA-Z0-9_\\-\\s]?[a-zA-Z0-9]+)|([a-zA-Z0-9])$
只需添加一个或接受字母或数字的条件