所以我正在开发一个项目,从 Java 的 .doc 文件中提取大写单词。我正在使用正则表达式,但下面的正则表达式被某人在旧的 .vba 脚本中使用。我需要找到括号包围的所有大写单词。例如(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()));
}
}
}
}
通过上面的代码和正则表达式,我得到两个大写字母,而不仅仅是带有括号的所有大写单词。
最佳答案
括号是正则表达式中的保留字符,因此您的第一个 *
不会修改任何内容。至少,你需要逃避它们:
\(*[A-Z]*[A-Z]*\)
但是,请不要停止阅读!应该注意的是,上面的正则表达式与:
\(*[A-Z]*\)
但最重要的是,我认为这不是您想要的正则表达式。我认为您正在 try catch 由括号包围的非零数量的连续大写字母,或者:
\([A-Z]+\)
“+”是一个或多个匹配,您会注意到我已经停止重复左括号。为了获得奖励积分,您可能需要处理括号开头或结尾的空格:
\(\s*[A-A]+\s*\)
但请注意,这将跨新行匹配。希望这有帮助!
关于java - 使用 Apache POI 和 RegEx 来提取大写单词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12305071/