2014-01-15 161 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

相關問題