我有以下格式"[[Animal rights]] [[Anthropocentrism]] [[Anthropology]]"
的输入字符串,我需要提取标记"Animal rights" , "Anthropocentrism"
等等。
我尝试在String库中使用split方法,但是我无法找到合适的正则表达式来获取令牌,如果有人可以提供帮助,那就太棒了。
我基本上是在尝试解析维基百科XML文件中的内部链接,您可以查看格式here。
答案 0 :(得分:7)
您可能不应该在此使用split()
,而是使用Matcher
:
String input = "[[Animal rights]] [[Anthropocentrism]] [[Anthropology]]";
Matcher m = Pattern.compile("\\[\\[(.*?)\\]\\]").matcher(input);
while (m.find()) {
System.out.println(m.group(1));
}
Animal rights Anthropocentrism Anthropology
答案 1 :(得分:2)
这样的模式应该有效:
\[\[(.*?)\]\]
这将匹配文字[[
后跟0或0以上的任何字符,非贪婪地在第1组中捕获,然后是文字]]
。
不要忘记转义Java字符串文字中的\
:
Pattern.compile("\\[\\[(.*)?\\]\\]");
答案 2 :(得分:1)
使用正则表达式非常容易。
\[\[(.+?)\]\]
我建议您执行.+
以确保括号中确实存在某些内容,如果您不存在某些内容,则将无法获得null
试图把它放在你的阵列中。
string output = new string [10];
string pattern = "\[\[(.+?)\]\]";
string input = "[[Animal rights]] [[Anthropocentrism]] [[Anthropology]]";
Matcher m = Pattern.compile(pattern).matcher(input);
int increment= 0;
while (m.find()) {
output[increment] = m.group(1);
increment++;
}
既然你说你想学习正则表达式,我也会把它分解。
\[
2x 正在查找[
括号,您需要\
,因为它是正则表达式的特殊字符.
可以表示除换行符之外的所有字符+
表示该角色中的一个或多个?
重复上一个项目一次或多次。懒惰,所以引擎首先匹配前一个项目一次,然后尝试不断增加前一项目匹配的排列。\]
正在捕获]
答案 3 :(得分:0)
尝试下一个:
String str = "[[Animal rights]] [[Anthropocentrism]] [[Anthropology]]";
str = str.replaceAll("(^\\[\\[|\\]\\]$)", "");
String[] array = str.split("\\]\\] \\[\\[");
System.out.println(Arrays.toString(array));
// prints "[Animal rights, Anthropocentrism, Anthropology]"