查找具有特定模式但尚未在列表中找到的字符串(Java正则表达式)

时间:2015-05-13 04:16:17

标签: 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]+

在上面的例子中,标签列表中指定标签以外的标签是:" CD"和" GH"

我不知道标签名称" CD"和" GH"事先,所以不能像这样简单地寻找它们:

Pattern p = Pattern.compile("\\b"+"CD"+"=");
Matcher m = p.matcher(line);

请注意,输出应该是不在列表中的标签的名称,即" CD"和" GH"在上面的例子中

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

哎呀看起来我回答了我自己的问题,虽然我不确定这是不是最好的方法。欢迎更好的答案或建议吗?

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

输出:

CD
GH