使用Regex进行验证

时间:2014-09-19 04:30:15

标签: java regex

我有一个类似的验证,字符串应至少包含一个字母数字。它可能包含_或 - 作为两者之间的可选字符。字符串应以字母数字开头和结尾。我尝试使用很多正则表达式,但我无法做到这一点。这是我的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"));

最后两个断言失败。请帮我解决这个问题。

3 个答案:

答案 0 :(得分:4)

以下正则表达式允许使用一个或多个字母数字字符,并允许在字母数字字符之间使用-_,但不允许在第一个或最后一个字符。

^[a-zA-Z0-9]+(?:[-_]+[a-zA-Z0-9]+)*$

DEMO

如果您不想要连续的_-,请删除非捕获组中存在的字符类之后的+

^[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])$

只需添加一个或接受字母或数字的条件