Java 我的正则表达式在单词和';T

Java 我的正则表达式在单词和';T,java,regex,Java,Regex,我有一个正则表达式,用来捕获大写单词。因此,如果有一个或多个单词都是大写,正则表达式就会找到它。但我还有另一个正则表达式,它捕获一个单词,所有单词都是大写的。出于某种原因,第一个reg-ex捕获的是一个全大写的单词,末尾有一个拖尾空格。这是我的密码 //This looks for All Cap Words inside parens-completed String ucParensRegEx = "\\([A-Z]+\\)"; regexParser(we, ucP

我有一个正则表达式,用来捕获大写单词。因此,如果有一个或多个单词都是大写,正则表达式就会找到它。但我还有另一个正则表达式,它捕获一个单词,所有单词都是大写的。出于某种原因,第一个reg-ex捕获的是一个全大写的单词,末尾有一个拖尾空格。这是我的密码

    //This looks for All Cap Words inside parens-completed
    String ucParensRegEx = "\\([A-Z]+\\)";
    regexParser(we, ucParensRegEx);
    //This looks for All Upper case words with two or more letters.- completed
    String twoPlusUCRegEx = "[A-Z][A-Z]+";
    regexParser(we, twoPlusUCRegEx);

    String letNumRegEx = "[A-Z][A-Z0-9][A-Z]+";
    regexParser(we, letNumRegEx);

    //Looks for Uppercase words that start with a number-Completed
    String numLetRegEx = "[0-9][A-Z][A-Z]+";
    regexParser(we, numLetRegEx);

    String upperwhitespaceRegEx = "(\\b[A-Z'][A-Z]+\\b\\s*)+";
    regexParser(we, upperwhitespaceRegEx);

private void regexParser(WordExtractor we, String regex) {
    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);
            while (m.find()) {
                if (!sequences.contains(data.substring(m.start(), m.end())) && !data.equals("US ") && !data.contains("ARABIC") && !data.contains("ALATEC") && !data.contains("HYPERLINK")) {
                    sequences.add(data.substring(m.start(), m.end()));
                    System.out.println(data.substring(m.start(), m.end()));
                    Acronym acc = new Acronym(data.substring(m.start(), m.end()), data, "", false);
                    newAcList.add(acc);
                }
            }
        }
    }
}
//这将查找parens中已完成的所有Cap单词
字符串ucParensRegEx=“\\([A-Z]+\\)”;
regexParser(we,ucparesregex);
//这将查找包含两个或更多字母的所有大写单词。-已完成
字符串twoPlusUCRegEx=“[A-Z][A-Z]+”;
regexParser(we,twoPlusUCRegEx);
字符串letNumRegEx=“[A-Z][A-Z0-9][A-Z]+”;
regexParser(we,letNumRegEx);
//查找以数字结尾的大写单词
字符串numletreegex=“[0-9][A-Z][A-Z]+”;
regexParser(we,numletreegex);
字符串upperwhitespaceRegEx=“(\\b[A-Z'][A-Z]+\\b\\s*)+”;
regexParser(we,upperwhitespaceRegEx);
私有void regexParser(WordExtractor we,String regex){
if(we.getParagraphText()!=null){
String[]dataArray=we.getParagraphText();
for(int i=0;i
内部单词边界是不必要的(因为
\s[A-Z]
将在空白和大写字母之间定义一个单词边界)。所以你需要做的就是匹配一个大写单词,然后有选择地匹配后面的一堆其他大写单词


内部单词边界是不必要的(因为
\s[A-Z]
将在空白和大写字母之间定义一个单词边界)。因此,您所需要做的就是匹配一个大写字母,然后有选择地匹配它后面的一组其他大写字母。

您可以发布一个匹配的字符串示例吗?您的正则表达式都没有捕获尾随的空格字符,所以问题一定出在其他地方。抱歉,我不得不添加它…我忘了。查看upperwhitespaceRegEx变量定义。是的,该regex以与空白字符匹配的
\s*
结尾。
*
是一个贪婪的量词,这意味着它会选择尽可能长的匹配。如果您想要最短的匹配(以便在最后匹配的单词后不包含空格),您应该使用“不情愿”版本
*?
请参见我正在寻找多个大写单词,如HAM三明治,但在一个大写单词(如HAM)上,我得到HAM和一个空格。一个单词的正则表达式就行了。你能给出一个你不希望匹配的匹配字符串的例子吗?你的正则表达式都没有捕获尾随的空格字符,所以问题一定出在其他地方。对不起,我不得不添加它…我忘了。查看upperwhitespaceRegEx变量定义。是的,该regex以与空白字符匹配的
\s*
结尾。
*
是一个贪婪的量词,这意味着它会选择尽可能长的匹配。如果您想要最短的匹配(以便在最后匹配的单词后不包含空格),您应该使用“不情愿”版本
*?
请参见我正在寻找多个大写单词,如HAM三明治,但在一个大写单词(如HAM)上,我得到HAM和一个空格。因此,用一个词来说,regex是可行的。
"\\b[A-Z'][A-Z]+(\s+[A-Z'][A-Z]+)*\\b"