使用带有RegEx的Apache POI来提取大写单词

时间:2012-09-06 17:09:08

标签: java regex

所以我正在开发一个Project,用Java中的.doc文件中提取大写单词。我正在使用正则表达式,但下面的正则表达式是由旧的.vba脚本中的someonelse使用的。我需要找到被括号括起来的所有大写单词。例如(WORD)。我知道下面的正则表达式会给我一个悬空的元字符错误,所以正则表达式会是什么。

private static final String REGEX = "(*[A-Z]*[A-Z]*)";
private void parseWordText(File file) throws IOException { 
    FileInputStream fs = new FileInputStream(file); 
    HWPFDocument doc = new HWPFDocument(fs); 
    WordExtractor we = new WordExtractor(doc); 
    if (we.getParagraphText() != null) { 
        String[] dataArray = we.getParagraphText(); 
        for (int i = 0; i < dataArray.length; i++) { 
            String data = dataArray[i].toString(); 
            Pattern p = Pattern.compile(REGEX); 
            Matcher m = p.matcher(data); 
            List<String> sequences = new Vector<String>(); 
            while (m.find()) { 
                sequences.add(data.substring(m.start(), m.end())); 
                System.out.println(data.substring(m.start(), m.end())); 
            } 
        } 
    } 
} 

使用上面的代码和正则表达式,我得到两个大写字母,而不仅仅是带有parens的全部大写字母。

1 个答案:

答案 0 :(得分:1)

括号是正则表达式中的保留字符,因此您的第一个*不会修改任何内容。至少,你需要逃脱它们:

\(*[A-Z]*[A-Z]*\)

然而,不要停止阅读!应该注意的是,上面的正则表达式与:

相同
\(*[A-Z]*\)

但最重要的是,我认为这不是你想要的正则表达式。我想你正试图捕获括号所包围的非零数量的连续大写字母,或者:

\([A-Z]+\)

'+'是一个或多个匹配,你会注意到我已经停止重复左边的paren。对于奖励积分,您可能希望在括号的开头或结尾处理空格:

\(\s*[A-A]+\s*\)

但请注意,这将与新行匹配。希望这有帮助!