我有一个包含如下字符串的文本文件:
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("\\{(.*?)^[|\\(\\)]\\}");
但这没有任何匹配。我的思维过程是我想要花括号内的所有内容,除了包含字符“|”,“(”或“)”的任何部分。有人可以解释我的表达方式有什么问题吗?
答案 0 :(得分:4)
你的正则表达式应如下所示:
\{([^\}\|]*)(\|\()?\}
说明:
\{
与{在开始时([^\}\|]*)
匹配{}之间的任何内容,但不匹配|(最后(\|\()?
匹配|(如果存在则结束,否则它不匹配任何内容\}
与最后的}匹配答案 1 :(得分:1)
这个应该这样做:
Pattern pattern = Pattern.compile("\\{(.*?)([|(]{2})?\\}");
分解&#34;([|(] {2})?&#34;,它是其中一个字符&#34; |&#34;,&#34;(&#34;两次,然后使这个可选。所以,&#34; |(&#34;,&#34;(|&#34;或&#34;&#34;(无)实际上会匹配。