-1

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

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

我基本上是在尝试解析 Wikipedia XML 文件中的内部链接,您可以在此处查看格式。

4

4 回答 4

7

您可能不应该split()在这里使用,而是使用Matcher

String input = "[[Animal rights]] [[Anthropocentrism]] [[Anthropology]]";
Matcher m = Pattern.compile("\\[\\[(.*?)\\]\\]").matcher(input);

while (m.find()) {
    System.out.println(m.group(1));
}
动物权益
人类中心主义
人类学
于 2013-09-12T19:35:00.633 回答
2

像这样的模式应该有效:

\[\[(.*?)\]\]

这将匹配一个文字[[,后跟零个或多个任何字符,非贪婪地,在组 1 中捕获,然后是文字]]

不要忘记\在 Java 字符串文字中转义:

Pattern.compile("\\[\\[(.*)?\\]\\]");
于 2013-09-12T19:34:52.847 回答
1

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

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

正则表达式可视化

在 Debuggex 上实时编辑

我建议执行 a.+以确保括号中确实有某些内容,并且当您尝试将其放入数组时,如果某些内容不存在 ,您将不会得到 a 。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正在寻找[你需要的括号,\因为它是正则表达式的特殊字符
  • .可以表示除换行符以外的所有字符
  • +表示该字符中的一个或多个
  • ?重复上一个项目一次或多次。懒惰,所以引擎首先只匹配前一个项目一次,然后再尝试与前一个项目的匹配不断增加的排列。
  • \]正在捕捉]
于 2013-09-12T19:35:45.523 回答
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]"
于 2013-09-12T19:56:40.060 回答