【问题标题】:Regex to validate at least two character classes (letters, number , special characters)正则表达式验证至少两个字符类(字母、数字、特殊字符)
【发布时间】:2019-05-02 06:16:03
【问题描述】:

我想为只包含小写字母[az]、大写字母[AZ]、数字[0-9]、特殊字符[!#+,-./的输入字符串匹配java中的至少两个字符类:=@] 。

我已经到了下面提到的正则表达式,但它不起作用:

((?=.*[a-z])(?=.*[A-Z]))|((?=.*[a-z])(?=.*[\\d]))|((?=.*[A-Z])(?=.*[\\d]))|((?=.*[!#+,.\\=:=@-])(?=.*[\\d]))|((?=.*[!#+,.\\=:=@-])(?=.*[a-z]))|((?=.*[!#+,.\\=:=@-])(?=.*[A-Z]))

例子:

wel123 - valid
123@@! - valid
@@@aaa - valid
!!!BDC - valid
ABC123 - valid
rrirrra - invalid
1234567 - invalid
ABCFESS - invalid
@@@!!!! - invalid

提前致谢。

【问题讨论】:

  • 你不能用多个正则表达式来做这个吗?
  • 请为应该成功的案例和不应该成功的案例提供示例输入字符串。
  • 请提供示例字符串和所需的输出。
  • 您能否分享您当前的代码并准确说明哪些代码不起作用?

标签: java regex


【解决方案1】:

您的正则表达式中唯一缺少的是添加 start ^$ 结束锚点并正确分组整个正则表达式。我还从您的正则表达式中删除了不必要的分组,您可以使用此正则表达式,

^(?:(?=.*[a-z])(?=.*[A-Z])|(?=.*[a-z])(?=.*[\d])|(?=.*[A-Z])(?=.*[\d])|(?=.*[!#+,.\\=:=@-])(?=.*[\d])|(?=.*[!#+,.\\=:=@-])(?=.*[a-z])|(?=.*[!#+,.\\=:=@-])(?=.*[A-Z])).+$

Regex Demo

虽然这种方法有效,但我建议您编写代码来实现这一点,因为一般人可能无法维护这个正则表达式。

验证字符串而不是纯正则表达式的 Java 代码方法

以下是一种使用 Java 代码的方法,您可以将模式的List 以及要验证的字符串和匹配所需的最小模式的数字一起传递给方法。检查此代码,

public static void main(String[] args) {
    int minRequiredMatch = 2;
    List<String> list = Arrays.asList("wel123","123@@!","@@@aaa","!!!BDC","ABC123","rrirrra","1234567","ABCFESS","@@@!!!!");

    list.forEach(x -> {
        System.out.println(x + " - " + (validateTwoCharSets(x, minRequiredMatch)?"Valid":"Invalid"));
    });
}

public static boolean validateTwoCharSets(String str, int minRequiredMatch) {
    List<Pattern> patList = new ArrayList<>();
    patList.add(Pattern.compile("[a-z]"));
    patList.add(Pattern.compile("[A-Z]"));
    patList.add(Pattern.compile("[0-9]"));
    patList.add(Pattern.compile("[!#+,-./:=@]"));

    return validateTwoCharSets(patList, str, minRequiredMatch);
}

public static boolean validateTwoCharSets(List<Pattern> patList, String str, int minRequiredMatch) {
    if (minRequiredMatch <0 || minRequiredMatch > patList.size()) {
        throw new RuntimeException("minRequiredMatch must be a positive number and not more than pattern list size.");
    }
    int matchCount = 0;

    for (Pattern p : patList) {
        Matcher m = p.matcher(str);
        if (m.find()) {
            matchCount++;
        }
        if (matchCount >= minRequiredMatch) {
            return true;
        }
    }

    return false;
}

对于您给定的数据集打印如下,

wel123 - Valid
123@@! - Valid
@@@aaa - Valid
!!!BDC - Valid
ABC123 - Valid
rrirrra - Invalid
1234567 - Invalid
ABCFESS - Invalid
@@@!!!! - Invalid

【讨论】:

  • 非常感谢 pushpesh 提供的正则表达式以及干净的 java 方法。
  • 很高兴帮助@MohitAgrawal。此外,我建议您使用 Java 代码方法,因为您可以看到它非常灵活且可维护。假设明天你决定,而不是任何两个模式,任何三个模式都应该匹配,然后你不需要处理大量的正则表达式更改,你需要做的只是将你需要作为参数传递的值从 2 更改为 3。应该使用 Java 代码成为小菜一碟。
【解决方案2】:

我了解您想要一个匹配任何字符串的正则表达式,该字符串包含您定义的集合中至少 2 个 连续 个字符。

我会选择这个:

.*[\w\d!#+,-./:=@]{2}.*

查看完整代码:

package so20190502;

public class TwoOrMoreChars {

    public TwoOrMoreChars() {
    }

    public boolean matches(String s) {
        return s.matches(".*[\\w\\d!#+,-./:=@]{2}.*");
    }

    private void testString(String s) {
        System.out.println("String '" + s + "' does " + (matches(s)?"":"NOT") + " match.");
    }

    public static void main(String[] args) {
        TwoOrMoreChars me = new TwoOrMoreChars();
        me.testString("1");
        me.testString("1%2");
        me.testString("1%2%a%-%'");
        me.testString("1%2a-'");
    }

}

这个输出:

String '1' does NOT match.
String '1%2' does NOT match.
String '1%2%a%-%'' does NOT match.
String '1%2a-'' does  match.

HTH!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-07
    • 2015-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多