拆分由java中的[[]]分隔的字符串?

时间:2013-09-12 19:32:27

标签: java regex string

我有以下格式"[[Animal rights]] [[Anthropocentrism]] [[Anthropology]]"的输入字符串,我需要提取标记"Animal rights" , "Anthropocentrism"等等。

我尝试在String库中使用split方法,但是我无法找到合适的正则表达式来获取令牌,如果有人可以提供帮助,那就太棒了。

我基本上是在尝试解析维基百科XML文件中的内部链接,您可以查看格式here

4 个答案:

答案 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)

使用正则表达式非常容易。

\[\[(.+?)\]\]

Regular expression visualization

Edit live on Debuggex

我建议您执行.+以确保括号中确实存在某些内容,如果您不存在某些内容,则将无法获得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]"