在特定模式java中获取字符串

时间:2014-10-18 23:23:18

标签: java

我有一个看起来像这样的文本文件:

IX: {Series|(}              {2}
IX: {Series!geometric|(}    {4}
IX: {Euler's constant}      {4}
IX: {Series!geometric|)}    {4}
IX: {Series!arithmetic|(}   {4}
IX: {Series!arithmetic|)}   {5}
IX: {Series!harmonic|(}     {5}
IX: {Euler's constant}      {5}
IX: {Series!harmonic|)}     {5}
IX: {Series|)}              {5}

我想要做的就是为每个字符串和每次出现获取“{”和“}”内的字符串。例如,对于第一个字符串,我可以得到“Series |(”和“2”。我在如何处理这个问题时遇到了很多麻烦。我知道我可以分开“\ {”但那会仍然留下结束括号,这意味着我将不得不遍历拆分数组中的每个元素并进一步细分它,这是不干净的,似乎不适用于各种情况。是否有不同的方法来处理这个?

到目前为止,我尝试过使用子字符串:

File file = new File("test.txt");
        BufferedReader br = new BufferedReader(new FileReader(file));
        String line = null;
        while((line = br.readLine()) != null){
            String[] parts = line.split("\\{");
            String p = parts[1].substring(0,parts[1].length()-1);
            System.out.println(p); 
            System.out.println("");
        }

但是返回 - 使用顶部字符串作为示例 - “系列|(}”,当我想要的是“系列|(”。此方法的问题还在于字符串的长度似乎不同所以无论我从字符串长度中减去什么数字,它都不适用于所有字符串。

我知道正则表达式在这里会更有用,但它们对我来说很困惑,而且在我离开的时候我很难理解它们。如果有任何其他方法更简单,我会非常感激。

编辑:我尝试了以下内容:

String line = "IX: {Series|(}               {2}";
        Pattern pattern = Pattern.compile("\\{(.*?)\\}");
        Matcher matcher = pattern.matcher(line);
        System.out.println(matcher.group(1));

但是我收到了一个无匹配的错误。有人可以解释我的正则表达式不正确吗?我离开了这里发布的问题:How to extract a substring using regex

2 个答案:

答案 0 :(得分:1)

你应该通过闭括号再次拆分()字符串。

File file = new File("test.txt");
BufferedReader br = new BufferedReader(new FileReader(file));
String line = null;
while((line = br.readLine()) != null) {
    if (line.contains("{")) {
        String[] parts = line.split("\\{");
        String p = parts[1].substring(0,parts[1].length()-1);
        parts = p.split("\\}");
        System.out.println(parts[0] + "\n"); 
    }
}

答案 1 :(得分:0)

感谢la-comahedra的解决方案效果很好。如果有人想用正则表达式做,不过,我找到了解决方案:

String line = "IX: {Series|(}               {2}";
        Pattern pattern = Pattern.compile("\\{(.*?)\\}");
        Matcher matcher = pattern.matcher(line);
        while(matcher.find()){
            System.out.println(matcher.group(1));
        }

此解决方案基于问题中的解决方案:How to extract a substring using regex

上述代码的输出为:

Series|(
2