您可以使用
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(" ", "_"))作为最后的接触。