匹配字符串中的多个模式

时间:2014-04-14 20:00:07

标签: java regex arraylist filter

我是第一次使用Pattern and Match类而且我遇到了问题。 我想只输出匹配所有模式的字符串,但我得到的是分别匹配模式的行,首先是通过第一个过滤器的行,第二个是包含第二个过滤器的行。我的代码:

  public static void main(String[] args) {

    Pattern p;
    Matcher m;
    String f;
    ArrayList<String> arr = new ArrayList<String>();
    ArrayList<String> fArr = new ArrayList<String>();

    arr.add("A");
    arr.add("C");
    arr.add("A B");
    arr.add("A C");
    arr.add("A C M");

    String A = ("A");
    String C = ("C");
    fArr.add(A);
    fArr.add(C);

    for (int i = 0; i < fArr.size(); i++) {
        f = fArr.get(i);
        System.out.println("\nFILTER: " + f);
        for (int j = 0; j < arr.size(); j++) {
            p = Pattern.compile(f);
            m = p.matcher(arr.get(j));
            if (m.find()) {
                System.out.println(arr.get(j));
            }
        }
    }

}

这个输出是:

FILTER: A
A
A B
A C
A C M

FILTER: C
C
A C
A C M

此示例仅使用两个过滤器,但我不知道以后是否需要添加更多过滤器。

这是所需的输出

 A C
 A C M

使用模式和匹配是否有可能做到这一点?如果没有,还有其他课程吗?提前谢谢。

4 个答案:

答案 0 :(得分:0)

你有一个额外的循环。消除另一个循环并尝试这个:

for (int j = 0; j < arr.size(); j++) 
{
    p = Pattern.compile("A C");
    m = p.matcher(arr.get(j));
    if (m.find()) 
    {
        System.out.println(arr.get(j));
    }
}

输出:

A C
A C M

编辑:如果您想要包含多个字符的字符串,则应添加if条件。

for (int j = 0; j < arr.size(); j++) 
{
    p = Pattern.compile("C");
    if(arr.get(j).length() > 1)
    {
        m = p.matcher(arr.get(j));
        if (m.find()) 
        {
            System.out.println(arr.get(j));
        }
    }
}

答案 1 :(得分:0)

由于您需要匹配所有模式,因此只有其中一种模式匹配时才能进行打印。

你想要模式A和模式B和......根据De Boole的定律,这与Not(非模式A或非模式B)相同。

这是什么意思?重复测试,如果其中一个字符串与模式不匹配,请将其从数组中删除。最后,只打印完所有匹配后保存在数组中的字符串。

答案 2 :(得分:0)

你的循环以错误的方式嵌套。试试这个:

for (int j = 0; j < arr.size(); j++) {
    boolean is_a_match = true;
    for (int i = 0; i < fArr.size(); i++) {
        f = fArr.get(i);
        p = Pattern.compile(f);
        m = p.matcher(arr.get(j));
        if (!m.find()) {
            is_a_match = false;
            break;
        }
    }
    if (is_a_match) {
        System.out.println(arr.get(j));
    }
}

这个想法是,如果它通过内部循环没有不匹配,那么它被视为匹配。

答案 3 :(得分:0)

试试这个

Pattern p = Pattern.compile(" (\\s+A\\s+) .* (\\s+C\\s+).*");