使用模式从字符串中删除数字和字符

时间:2014-12-18 13:24:27

标签: java regex string

所以我有一个单词列表,比如50,000个单词,我想删除它们中的某些数字和字母。具体来说,我想删除任何数字从0-99后跟E或Z的数据,例如:4E, 11Z, 11E, 20Z

我想删除它们的字样如下: -

  • 6S,9,12S-三甲基-2E,4E,8E,10E-十四碳四烯酸
  • 7Z,14Z-二十碳二烯酸
  • 13,17,21,25-四甲基-5Z-六十六碳烯酸
  • CDP-DG(18:1(11Z)/ 22:6(4Z,7Z,10Z,13Z,16Z,19Z))
  • PC(20:4(5Z,8Z,11Z,14Z)/ 17:2(9Z,12Z))

正如你所看到的那样,我想删除的东西在单词中以不同的方式显示(如括号内或连字符之后)。到目前为止,我已经完成了:

public class EZConfig {

    public static void main(String[] args) throws IOException{

     BufferedReader br = new BufferedReader(new FileReader("C:/Users/colles-a-l-kxc127/Dropbox/PhD/Java/MetabolitesCompiled/src/commonNames"));

        try {

            StringBuilder sb = new StringBuilder();
            String line = br.readLine();

            while (line != null) {

                if(line.contains("[0-99][E|Z]")){

                    System.out.println(line + " TRUE");
                }
                else{
                    System.out.println(line);
                }

                line = br.readLine();
            }

        } finally {
            br.close();
        }
    }
}

只是为了看看我是否可以拿起数字/ E或Z注释,但我似乎无法。我需要基本上编写一些可以从我的单词列表中删除所有这些注释的脚本。任何人都知道我能做些什么才能实现这个目标?

1 个答案:

答案 0 :(得分:3)

您无法将正则表达式传递给String.contains - 或者更确切地说,它将被视为文字。

我会使用这个草案解决方案:

// declare as constant somewhere
static final Pattern MY_PATTERN = Pattern.compile("\\d+[EZ]");

然后,您可以使用:

代替您的if(line.contains("[0-99][E|Z]")){语句
if (MY_PATTERN.matcher(line).find()) {

从长远来看,如果你从你的话中删除它,你可能想要使用:

line = line.replaceAll("\\d+[EZ]", "");

修改

由于newbiedoodle提及(没有注意到),字符类[0-99]099之间的范围不匹配。

如果您需要将数字限制为< 100,则可以使用\\d{1,2}代替更通用的\\d+

备注

要删除模式周围的[可选]括号,启动它的可选连字符以及结束它的可选逗号,您可以使用以下习语:"-?\\(?\\d+[EZ]\\)?,?"

请注意,在此上下文中,括号需要进行双重转义。