6

我有一个字符串

String s="[[Identity (philosophy)|unique identity]]";

我需要将其解析为 .

s1 = Identity_philosphy 
s2= unique identity

我试过以下代码

Pattern p = Pattern.compile("(\\[\\[)(\\w*?\\s\\(\\w*?\\))(\\s*[|])\\w*(\\]\\])");
  Matcher m = p.matcher(s);
while(m.find())
{
....
}

但是模式不匹配..

请帮忙

谢谢

4

2 回答 2

1

利用

String s="[[Identity (philosophy)|unique identity]]";
String[] results = s.replaceAll("^\\Q[[\\E|]]$", "")    // Delete double brackets at start/end
      .replaceAll("\\s+\\(([^()]*)\\)","_$1")           // Replace spaces and parens with _
       .split("\\Q|\\E");                               // Split with pipe
System.out.println(results[0]);
System.out.println(results[1]);

输出:

Identity_philosophy
unique identity
于 2020-06-04T19:42:57.637 回答
0

您可以使用

String s="[[Identity (philosophy)|unique identity]]";
Matcher m = Pattern.compile("\\[{2}(.*)\\|(.*)]]").matcher(s);
if (m.matches()) {
    System.out.println(m.group(1).replaceAll("\\W+", " ").trim().replace(" ", "_")); // // => Identity_philosphy
    System.out.println(m.group(2).trim()); // => unique identity
}

查看Java 演示

细节

"\\[{2}(.*)\\|(.*)]]"withmatches()被解析为^\[{2}(.*)\|(.*)]]\z匹配以 开头的字符串的模式, [[然后匹配并捕获除换行符之外的任何 0 个或更多字符到第 1 组中,然后匹配 a |,然后匹配并捕获任何 0 个或更多字符除了换行符尽可能多地进入第 2 组,然后匹配]]。请参阅正则表达式演示

第 2 组中的内容可以从空格中删除并按原样使用,但第 1 组应通过将所有 1+ 非单词字符块替换为空格 ( .replaceAll("\\W+", " ")) 进行预处理,然后修剪结果 ( .trim()) 并将所有空格替换为_( .replace(" ", "_"))作为最后的接触。

于 2020-01-27T15:07:07.940 回答