我正在尝试使用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
思想?
答案 0 :(得分:5)
基于您使用(
和)
创建组的事实,我假设您知道括号是正则表达式中的特殊字符。但是你知道特殊字符与文本中的文字不匹配吗?请注意,(.*)
不需要匹配的文本以括号开头和结尾。
要让特殊字符与其文字匹配,您需要转义它们。您可以通过多种方式完成此操作,例如:
\
(需要以"\\"
字符串形式写入),[
]
将它们包围起来,以创建仅代表一个字符的字符类 - 特殊字符。 同样|
是正则表达式中的特殊字符,代表OR
运算符,因此您还需要将其转义。
另一件事.+?
| (.+?)
尽管不愿意,|
会从找到的第一个|
开始匹配,这意味着它也可以接受其他(musician)
直到将找到music works | with | composer | James Hetfield (musician)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
。换句话说,这样的正则表达式会发现这个aprt
|
因此,为了防止在您接受的(musician)
而不是.
之间接受其他管道([^|]
),而不是|
使用final Pattern pattern = Pattern.compile("\\| ([^|]+) \\(musician\\)");
- 接受除{{|
之外的任何字符的字符类1}}。
请尝试使用此模式:
\\|
更新:
如果您的正则表达式匹配的部分可能在其之前没有?
(假设它在文本的开头),那么您可以简单地将([^|]+)
部分设为可选的用括号括起来并在其后添加matcher.gorup(1)
以使此部分可选。您也可以将其放在non-capturing-group中,这样matcher.group(2)
仍然可以成为索引1的组,这样您的代码就可以保持不变(您不必将final Pattern pattern = Pattern.compile("(?:\\| )?([^|]+) \\(musician\\)");
更改为{{1} })。
所以你可以试试
{{1}}
答案 1 :(得分:0)