我是第一次使用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
使用模式和匹配是否有可能做到这一点?如果没有,还有其他课程吗?提前谢谢。
答案 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+).*");