RegEx查找最后一个大写单词和另一个单词之间的单词

时间:2014-01-15 07:03:04

标签: java regex regex-lookarounds

我的问题是在两个单词之间找到一个单词。在这两个单词中,一个是全部大写单词,可以是任何单词,另一个单词是“是”。我尝试了几个正则表达式,但没有人帮助我。这是我的例子:

字符串:

In THE house BIG BLACK cat is very good.

预期产出:

cat

使用RegEx:

(?<=[A-Z]*\s)(.*?)(?=\sis)

上面的RegEx为我提供BIG BLACK cat作为输出,而我只需要cat

5 个答案:

答案 0 :(得分:3)

一种解决方案是简化你的正则表达式,

[A-Z]+\s(\w+)\sis

并仅使用匹配的组(即\1)。 See it in action here.

由于你想出了一些更复杂的东西,我假设你理解了上述表达的所有部分,但是对于稍后会出现的人,这里有更多细节:

  • [A-Z]+将匹配一个或多个大写字符
  • \s将匹配空格
  • (\w+)将匹配一个或多个字词([a-zA-Z0-9_])并将匹配存储在第一个匹配组中
  • \s将匹配空格
  • is将匹配“是”

我的例子非常具体,可能因不同的输入而分解。您的问题没有提供有关您期望的其他输入的许多详细信息,因此我不相信我的解决方案适用于所有情况。

答案 1 :(得分:2)

您希望查找依赖于炎症的几个部分的条件,然后仅检索该信息的特定部分。如果没有分组,这在正则表达式中是不可能的。在Java中你应该这样做:

public class Main {

    public static void main(String[] args) {
        Pattern pattern = Pattern.compile("[A-Z]+\\s(\\w+)\\sis");
        Matcher matcher = pattern.matcher("In THE house BIG BLACK cat is very good.");

        if (matcher.find())
           System.out.println(matcher.group(1));
        }
    }
}

group(1)是围绕它的括号。在这种情况下w+。这就是你的话。 group()的返回类型为String,因此您可以立即使用

答案 2 :(得分:2)

以下部分具有外部行为

(?<=[A-Z]*\s)(.*?)

由于某种原因,[A-Z]*匹配空字符串。 (.*?)BIG BLACK匹配。通过一些调整,我认为以下内容可行(但仍然可以匹配一些误报):

(?<=[A-Z]+\s)(\w+)(?=\sis)

一个稍微好一点的正则表达式是:

(?<=\b[A-Z]+\s)(\w+)(?=\sis)

希望有所帮助

答案 3 :(得分:2)

试试这个:

String TestInput = "In THE house BIG BLACK cat is very good.";
    Pattern p = Pattern
            .compile(
                    "(?<=\\b\\p{Lu}+\\s)  # lookbehind assertion to ensure a uppercase word before\n"
                            + "\\p{L}+    # matching at least one letter\n" 
                            + "(?=\\sis)  # lookahead assertion to ensure a whitespace is ahead\n"
                            , Pattern.COMMENTS);    Matcher m = p.matcher(TestInput);
if(m.find())
    System.out.println(m.group(0));

它只匹配“cat”。

对于任何语言的信件,

\p{L}都是Unicode property

对于任何语言的大写字母,

\p{Lu}都是Unicode property

答案 4 :(得分:0)

 String  m = "In THE house BIG BLACK cat is very good.";
       Pattern p = Pattern.compile("[A-Z]+\\s\\w+\\sis");
       Matcher m1 = p.matcher(m);
       if(m1.find()){
        String group []= m1.group().split("\\s");// split by space
        System.out.println(group[1]);// print the 2 position 
       }