所以我正在开发一个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的全部大写字母。
答案 0 :(得分:1)
括号是正则表达式中的保留字符,因此您的第一个*
不会修改任何内容。至少,你需要逃脱它们:
\(*[A-Z]*[A-Z]*\)
然而,不要停止阅读!应该注意的是,上面的正则表达式与:
相同\(*[A-Z]*\)
但最重要的是,我认为这不是你想要的正则表达式。我想你正试图捕获括号所包围的非零数量的连续大写字母,或者:
\([A-Z]+\)
'+'是一个或多个匹配,你会注意到我已经停止重复左边的paren。对于奖励积分,您可能希望在括号的开头或结尾处理空格:
\(\s*[A-A]+\s*\)
但请注意,这将与新行匹配。希望这有帮助!