Java使用正则表达式提取文本

时间:2014-10-12 00:50:52

标签: java regex

我正在尝试使用Java正则表达式从以下字符串中提取粗体子字符串:

音乐作品|与|作曲家| James Hetfield (音乐家)

我开始使用此代码,但这不起作用。我不确定我错过了什么:

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

思想?

2 个答案:

答案 0 :(得分:5)

  1. 基于您使用()创建组的事实,我假设您知道括号是正则表达式中的特殊字符。但是你知道特殊字符与文本中的文字不匹配吗?请注意,(.*)不需要匹配的文本以括号开头和结尾。

    要让特殊字符与其文字匹配,您需要转义它们。您可以通过多种方式完成此操作,例如:

    • 在它们之前添加\(需要以"\\"字符串形式写入),
    • 或者在大多数特殊字符的情况下,您可以使用[ ]将它们包围起来,以创建仅代表一个字符的字符类 - 特殊字符。

    同样|是正则表达式中的特殊字符,代表OR运算符,因此您还需要将其转义。

  2. 另一件事.+? | (.+?)尽管不愿意,|会从找到的第一个|开始匹配,这意味着它也可以接受其他(musician)直到将找到music works | with | composer | James Hetfield (musician) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 。换句话说,这样的正则表达式会发现这个aprt

    |

    因此,为了防止在您接受的(musician)而不是.之间接受其他管道([^|]),而不是|使用final Pattern pattern = Pattern.compile("\\| ([^|]+) \\(musician\\)"); - 接受除{{|之外的任何字符的字符类1}}。

  3. 请尝试使用此模式:

    \\|

    更新:

    如果您的正则表达式匹配的部分可能在其之前没有?(假设它在文本的开头),那么您可以简单地将([^|]+)部分设为可选的用括号括起来并在其后添加matcher.gorup(1)以使此部分可选。您也可以将其放在non-capturing-group中,这样matcher.group(2)仍然可以成为索引1的组,这样您的代码就可以保持不变(您不必将final Pattern pattern = Pattern.compile("(?:\\| )?([^|]+) \\(musician\\)"); 更改为{{1} })。

    所以你可以试试

    {{1}}

答案 1 :(得分:0)

([a-zA-Z](?:[a-zA-Z ]*))(?=\(musician\))

您也可以尝试这一点。抓住捕获。参见演示。

http://regex101.com/r/vR4fY4/19