[英]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.