java - 使用 Apache POI 和 RegEx 来提取大写单词

标签 java regex

所以我正在开发一个项目,从 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/

相关文章:

java - Android 版本冲突gradle

python - 如何使用 re.findall() 获得重叠匹配?

javascript - 匹配模式不起作用

javascript - 正则表达式查找字符串中的图像链接

php - 在某些字符之间放置一个 <br>

java - 使用客户端 Java 代码的 Spring Boot 多部分文件上传

java - AsyncTask 和 Handler 总是在注销后启动 Activity 两次

java - Android onTouch 不规则形状

java - 在 Java 中,什么时候应该创建检查异常,什么时候应该创建运行时异常?

regex - python re.split() 空字符串