2014-01-15 116 views
1

我的问题是找到两个单词之间的单词。在这两个单词中,一个是所有的大写单词,可以是任何东西,而另一个单词是“是”。我尝试了很少的正则表达式,但没有人帮助我。这是我的例子:正则表达式找到最后一个大写单词和另一个单词之间的单词

字符串:

In THE house BIG BLACK cat is very good. 

预期输出:使用

cat 

正则表达式:

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

上述正则表达式给我BIG BLACK cat作为输出,而我只需要cat

+0

虽然我得到了我的问题的答案。我只是想弄清楚下面这个场景的正则表达式: – immzi

回答

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)); 

它只匹配“猫”。

\p{L}是用于任何语言的信件的Unicode property

\p{Lu}是用于任何语言的大写字母的Unicode property

+0

+1看起来不错,学到了东西 – avalancha

+0

在阅读了这个问题几次后,我真的认为这是OP所寻找的。 – lostriebo

+0

感谢您的解决方案。这适用于甚至Unicode字符。干杯! – immzi

3

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

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

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

既然你想出了更复杂的东西,我想你理解了上述表达的但后来有人谁可能一起去所有的部件,这里有更多的细节:

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

我的例子很具体,可以分解为不同的输入。您的问题没有提供您期望的其他输入的许多详细信息,所以我不确定我的解决方案是否适用于所有情况。

+1

简单而有效 – thefourtheye

+0

但是不幸的是也错了,OP要求'[...]而我只需要cat.',这不是这个正则表达式给你的东西,如果你使用它原样。但一般的正则表达式非常好:) – avalancha

+0

@avalancha我有点困惑。正则表达式提供'猫',OP说他需要'猫'。它怎么错了? – lostriebo

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 
     } 
2

你想寻找一个条件,取决于infirmation的几个部分,然后只检索该信息的特定部分。这是不可能的,没有分组的正则表达式。在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,所以你可以用它马上

+0

Upvoted用于显示java实现并解释'group(1)'。我在这里学到了新东西。 – ufis

+1

当然,可以不分组*来查找依赖于多个部分信息的条件,然后只检索该信息的特定部分*。 OP并不遥远。 – stema

2

以下部分有一个交流中心的行为

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

出于某种原因[A-Z]*是匹配空字符串。并(.*?)匹配BIG BLACK。随着一点点的调整,我认为下面的工作(但它仍然符合一定的假阳性):

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

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

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

希望它可以帮助

+0

谢谢。这适用于我:) – immzi

相关问题