2014-10-12 115 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