繁体   English   中英

匹配字符串中的多个模式

[英]Match multiple patterns in strings

这是我第一次使用Pattern和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

是否可以使用“图案匹配”来做到这一点? 如果没有,再换一个班? 提前致谢。

您有一个额外的循环。 消除另一个循环并尝试以下循环:

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

由于需要所有样式都匹配,因此只有一种样式匹配时无法打印。

您想要模式A AND模式B AND ....根据De Boole的定律,这与非相同(不是模式A或非模式B)。

这意味着什么? 重复测试,如果其中一个字符串与模式不匹配,则将其从数组中删除。 最后,在所有匹配完成后,仅打印保留在数组中的字符串。

您的循环嵌套错误。 尝试这个:

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

这个想法是,如果它通过内部循环而没有不匹配,则被认为是匹配。

尝试这个

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM