匹配字符串中的所有字符,与序列中的顺序无关

时间:2014-07-01 12:33:10

标签: java regex

我希望使用正则表达式匹配字符串中的某些字符组,而不依赖于它们在字符串中的顺序。但是,唯一的要求是他们都必须在那里。

我试过了

String elD = "15672";
String t = "12";
if ((elD.matches(".*[" + t + "].*"))) {
    System.out.println(elD);
}

这个检查是否存在任何字符。但我希望他们都在那里。

我也试过

String elD = "15672";
String t = "12";
if ((elD.matches(".*(" + t + ").*"))) {
    System.out.println(elD);
}

这不起作用。我已经搜索了很长一段时间,但是当模式中的所有字符必须独立于它们的顺序存在于字符串中时,我找不到一个例子。

谢谢

2 个答案:

答案 0 :(得分:1)

你可以为此编写正则表达式,但它看起来不太好看。如果您想检查字符串是否包含xy,则需要使用look-ahead几次

^(?=.*x)(?=.*y).*$

并像

一样使用它
yourStirng.matches(regex);

但是这样你就需要创建自己的方法来生成动态正则表达式,并为要检查的每个字符添加(?=.*X)。您还需要确保此字符在?+等正则表达式中并不特殊。

更简单且效率更低的解决方案是创建自己的方法,检查您的字符串是否包含所有搜索过的字符,例如

public static boolean containsUnordered(String input, String searchFor){
    char[] characters = searchFor.toCharArray();
    for (char c: characters)
        if (!input.contains(String.valueOf(c)))
            return false;
    return true;
}

答案 1 :(得分:0)

您可以使用replaceAll方法从搜索字符串构建模式:

String s = "12";

String pattern = s.replaceAll("(.)", "(?=[^$1]*$1)");

注意:您不能多次测试相同的字符。 (即112提供与(?=[^1]*1)(?=[^1]*1)(?=[^2]*2)完全相同的(?=[^1]*1)(?=[^2]*2)

但在我看来,Pshemo方法可能更有效率。