【问题标题】:My regular expression is getting white space after words and shouldn't我的正则表达式在单词后出现空格,不应该
【发布时间】:2012-09-18 20:40:10
【问题描述】:

我有一个应该捕获大写单词的正则表达式。因此,如果有一个或多个单词都是大写的,则正则表达式会找到它。但我还有另一个正则表达式,它捕获一个单词全部大写的单词。出于某种原因,第一个 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);
                }
            }
        }
    }
}

【问题讨论】:

  • 您能否发布一个您不希望匹配的匹配字符串示例?
  • 您的正则表达式都没有捕获尾随空格字符,因此问题一定出在其他地方。
  • 对不起,我不得不添加它...我忘了。看一下 upperwhitespaceRegEx 变量定义。
  • 是的,那个正则表达式以\s* 结尾,它匹配空白字符。 * 是一个贪婪的量词,这意味着它会更喜欢最长的匹配。如果您想要最短的匹配(以免在最后一个匹配的单词之后包含空格),您应该使用“不情愿”版本*?
  • 看到我正在寻找多个大写单词,如 HAM SANDWICH,但在一个单词大写单词(如 HAM)上,我得到 HAM 和一个空格。所以一个词正则表达式会起作用。

标签: java regex


【解决方案1】:
"\\b[A-Z'][A-Z]+(\s+[A-Z'][A-Z]+)*\\b"

内部单词边界是不必要的(因为\s[A-Z] 将在空格和大写字母之间定义一个单词边界)。所以你需要做的就是匹配一个大写单词,然后可选地匹配一堆其他的大写单词。

【讨论】:

    猜你喜欢
    • 2016-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-29
    • 2018-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多