查找具有特定模式但尚未在列表中找到的字符串(Java正则表达式)
我有一个字符串:查找具有特定模式但尚未在列表中找到的字符串(Java正则表达式),java,regex,Java,Regex,我有一个字符串: String line = "9.99\t8.29\tAB=0.0;CD=0.0;EF=0.0;GH=0.0;LI=0.0;JK=0.0"; 我有一个标签列表: String[] labels = new String[] {"AB","EF","LI","JK"}; 标签匹配意味着它匹配以下模式“\\b”+label+“=” 我需要找出除了列表中的标签之外,还有没有其他标签。请注意,标签名称并不总是2个字符长,应该是一个或多个字符[a-zA-Z]+ 在上述示例中,标签列表
String line = "9.99\t8.29\tAB=0.0;CD=0.0;EF=0.0;GH=0.0;LI=0.0;JK=0.0";
我有一个标签列表:
String[] labels = new String[] {"AB","EF","LI","JK"};
标签匹配意味着它匹配以下模式“\\b”+label+“=”
我需要找出除了列表中的标签之外,还有没有其他标签。请注意,标签名称并不总是2个字符长,应该是一个或多个字符[a-zA-Z]+
在上述示例中,标签列表中指定标签以外的标签为:“CD”和“GH”
我事先不知道标签名称“CD”和“GH”,所以不能简单地这样查找:
Pattern p = Pattern.compile("\\b"+"CD"+"=");
Matcher m = p.matcher(line);
请注意,输出应该是列表中未列出的标签名称,即上面示例中的“CD”和“GH”Oops看起来像是在回答我自己的问题,尽管我不确定这是否是最好的方法。你会欢迎更好的答案或建议吗
import java.util.Arrays;
import java.util.HashSet;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class testRegex {
public static void main(String[] args)
{
HashSet<String> unseenLabels = new HashSet<String>();
String line = "9.99\t8.29\tAB=0.0;CD=0.0;EF=0.0;GH=0.0;LI=0.0;JK=0.0";
String[] labels = new String[] {".AB=",".EF=",".LI=",".JK="}; //Label with a dot at the beginning to prevent AB= and AAB= getting confused, for example
Pattern p = Pattern.compile("\\b[a-zA-Z]+=");
Matcher m = p.matcher(line);
while (m.find())
{
for(int i=0; i< labels.length; i++) {
if(!Arrays.asList(labels).contains(("." + m.group()))) unseenLabels.add(m.group());
}
}
for(String unseenLabel: unseenLabels) {
System.out.println(unseenLabel.substring(0,unseenLabel.length()-1));
}
}
}
请试试这个:
public static void main(String[] args) {
String line = "9.99\t8.29\tAB=0.0;CD=0.0;EF=0.0;GH=0.0;LI=0.0;JK=0.0";
String[] labels = new String[]{"AB", "EF", "LI", "JK"};
Pattern p = Pattern.compile("\\b[a-zA-Z]+=");
Matcher m = p.matcher(line);
while (m.find()) {
String groupName = m.group(0).substring(0,m.group(0).length()-1);
if (Arrays.asList(labels).contains(groupName)) {
continue;
} else {
System.out.println(groupName);
}
}
}
它将在找到组后删除最后一个字符(=
),然后检查它是否已存在于数组中,如果不存在,则打印它。输出为:
CD
GH
您应该为标签的名称建立一个通用模式,然后匹配所有标签,从中挑出您识别的标签和您不识别的标签。列表。包含的标签应按等于计算,因此您的
黑客攻击应该是不必要的
public static void main(String[] args) {
String line = "9.99\t8.29\tAB=0.0;CD=0.0;EF=0.0;GH=0.0;LI=0.0;JK=0.0";
String[] labels = new String[]{"AB", "EF", "LI", "JK"};
Pattern p = Pattern.compile("\\b[a-zA-Z]+=");
Matcher m = p.matcher(line);
while (m.find()) {
String groupName = m.group(0).substring(0,m.group(0).length()-1);
if (Arrays.asList(labels).contains(groupName)) {
continue;
} else {
System.out.println(groupName);
}
}
}