为什么正则表达式与字符串不匹配?

时间:2014-10-20 19:39:31

标签: java regex string

我有一个包含如下字符串的文本文件:

IX: {Series|(}                  {9}
IX: {Series!geometric!infinite} {13}
IX: {Series!geometric|(}        {13}
IX: {Series!geometric!finite|(} {13}

我只想要花括号内的部分。为了做到这一点,我做了一个正则表达式并将字符串添加到列表中。

public static LinkedList readFile(File file) throws IOException{
        BufferedReader br = new BufferedReader(new FileReader(file));
        String line = null;
        Pattern pattern = Pattern.compile("\\{(.*?)\\}");
        Matcher matcher;
        LinkedList<String> list = new LinkedList<String>();
        while((line = br.readLine()) != null){
            matcher = pattern.matcher(line);
            while(matcher.find()){
                list.add(matcher.group(1));
            }
        }
        br.close();
        return list;
}

以第一个字符串为例,返回“Series |(”和“9”。现在,我想从包含“|(或”)|的任何字符串中删除最后两个字符。 “在其中。例如,我想要”系列“而不是”系列|(“。我尝试修改我的reg表达式

Pattern pattern = Pattern.compile("\\{(.*?)^[|\\(\\)]\\}");

但这没有任何匹配。我的思维过程是我想要花括号内的所有内容,除了包含字符“|”,“(”或“)”的任何部分。有人可以解释我的表达方式有什么问题吗?

2 个答案:

答案 0 :(得分:4)

你的正则表达式应如下所示:

\{([^\}\|]*)(\|\()?\}

说明:

  • 首先,\{与{在开始时
  • 匹配
  • 然后,([^\}\|]*)匹配{}之间的任何内容,但不匹配|(最后
  • 下一步(\|\()?匹配|(如果存在则结束,否则它不匹配任何内容
  • 最后,\}与最后的}匹配

<强> Here is a running demo of the regex

答案 1 :(得分:1)

这个应该这样做:

Pattern pattern = Pattern.compile("\\{(.*?)([|(]{2})?\\}");

分解&#34;([|(] {2})?&#34;,它是其中一个字符&#34; |&#34;,&#34;(&#34;两次,然后使这个可选。所以,&#34; |(&#34;,&#34;(|&#34;或&#34;&#34;(无)实际上会匹配。