2014-10-12 32 views
0

我想從下面的字符串中使用Java正則表達式提取粗體字符串:Java使用正則表達式提取文本

音樂作品|用|作曲家| 詹姆斯·赫特菲爾德(音樂家)

我開始了與此代碼,但是這是行不通的。我不知道我缺少什麼:

final Pattern pattern = Pattern.compile("| (.+?) (musician)"); 
final Matcher matcher = pattern.matcher("music works | with | composer | James Hetfield (musician)"); 
matcher.find(); 
System.out.println(matcher.group(1)); // Prints String I want to extract 

想法?

回答

5
  1. 基於事實,你使用()創建我假設你知道括號在正則表達式的特殊字符組。但是您是否知道特殊字符與文本中的文字不匹配?請注意,(.*)不需要匹配的文本以括號開始和結束。

    要讓特殊字符匹配其文字,您需要將它們轉義出來。加入\之前(這需要在要寫入的字符串爲"\\"

  2. 或在最特殊字符的情況下,你可以圍繞他們[]

    • :你能做到這一點在許多方面,如創建只代表一個角色的角色類別 - 特殊角色類別。

    同樣|是在正則表達式表示OR運營商,所以你還需要轉義特殊字符。

  3. 另一件事是,.+?儘管是不情願,在| (.+?)將開始從發現第一|匹配,這意味着它也可以接受其他|直到(musician)會被發現。換句話說,這樣的正則表達式會發現這個APRT

    music works | with | composer | James Hetfield (musician) 
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
    

    因此,要防止一個你接受和(musician)代替.使用[^|]之間接受其它管道(|) - 它接受任何字符,除了|字符類。

所以用這個模式嘗試:

final Pattern pattern = Pattern.compile("\\| ([^|]+) \\(musician\\)"); 

UPDATE:

如果有可能應該由你的正則表達式匹配的部分不會有|它(讓之前說它是在你的文本的開始),那麼你可以簡單地使\\|部分可選,方法是用圓括號括起來,並在其後添加?以使該p藝術可選。你也可以把它放在non-capturing-group這將讓([^|]+)仍然是與索引1,這將讓你的代碼保持不變(你不必改變matcher.gorup(1)matcher.group(2))組。

所以,你可以用

final Pattern pattern = Pattern.compile("(?:\\|)?([^|]+) \\(musician\\)"); 
+0

這是有道理的。如果我還要包含「Metallica(音樂家)」等字符串,我想要提取「Metallica」的字符串 - 注意我沒有「|」在這種情況下。我希望能夠爲這兩種類型的輸入字符串提取樂隊名稱。 – 2014-10-12 01:07:25