【问题标题】:match all characters in a string independent of their order in the sequence匹配字符串中的所有字符,与它们在序列中的顺序无关
【发布时间】:2014-07-01 21:12:22
【问题描述】:

我想使用正则表达式函数匹配字符串中的某些字符组,而与它们在字符串中的顺序无关。但是,唯一的要求是它们都必须在那里。

我试过了

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);
}

这也不起作用。我已经搜索了很长时间,但我找不到一个示例,即模式中的所有字符都必须独立于它们的顺序出现在字符串中。

谢谢

【问题讨论】:

  • 尝试拆分 t,然后在每个字母中间添加 .*。所以它会像 .*t[0].*t[1].*t[2].......
  • 这很不方便。我将多次使用该程序,而不仅仅是一次,所以我不能每次都手动拆分,但无论如何谢谢!
  • 您不必手动拆分它。可以写一个小代码
  • 这里真的需要使用正则表达式吗?
  • 嗯,这是一个相当简单的任务。我认为Java中必须有一个内置的正则表达式,因为使用正则表达式比循环遍历序列更优雅?

标签: java regex


【解决方案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;
}

【讨论】:

  • 我会以安全的方式播放,然后使用循环。谢谢
【解决方案2】:

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

String s = "12";

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

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

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

【讨论】:

    猜你喜欢
    • 2019-07-19
    • 2013-06-04
    • 2015-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多