查找具有特定模式但尚未在列表中找到的字符串(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);
            }
        }
    }