java regex:将[[x]] [[y | z]]转换为[[x]] [[z]]

时间:2014-08-25 21:12:44

标签: java regex

我在java中有以下字符串。

"sdfsdfsdf [[Ubuntu Touch]]: [[Ubuntu (operating system)|Ubuntu]] sdfspp"

我想使用String#replaceAll(regex)来获取以下内容

"sdfsdfsdf [[Ubuntu Touch]]: [[Ubuntu]] sdfspp"

我试过

s = s.replaceAll("(\\[\\[)(.+)(\\|)(.+)(\\]\\])}", "$4");

没有成功

任何帮助?

感谢。

5 个答案:

答案 0 :(得分:2)

这适用于我(对于给定的字符串):

s = s.replaceAll("(\\[\\[)([^\\[\\]]+)(\\|)([^\\[\\]]+)(\\]\\])", "[[$4]]");

Demo on ideone.

答案 1 :(得分:1)

您似乎希望保留z,而不是y。因此,搜索\[[^[]+\|并将其替换为[(适当地转义反斜杠)。

即,在[[之间删除非|的字符序列。

答案 2 :(得分:1)

正则表达式问题应始终指定您希望搜索的规则或要遵循的转换。像“我有这个特定的字符串,我希望得到特定字符串作为结果”这样的问题永远不够好,因为如果你给它一个不同的字符串作为输入,我们就会猜测应该发生什么。总有几种方法可以解释这个问题,我们必须猜测哪一个。我们不介意读者。

假设您的规则是“如果您在[[和]]中看到|后跟一些文本,那么删除|和前面的文本”:那么这应该有效:

s = s.replaceAll("\\[\\[.*\\|(.*?\\]\\])","[[$1");

这是做什么的:

第一部分:选择第一个[[

第二部分:选取一些文字,然后选择|

第三部分:选取|后面的文字,然后选择其他]]。这部分在括号中;因此它成为第1组。?中的.*?是一个“不情愿的”限定符,这意味着它匹配尽可能少的字符以进入下一个]]。这是必要的,因为如果您在输入中有多个]],则不希望匹配缩放所有[[..]]

替换文本是[[后面是第三部分(第1组)。因此,第二部分,即后跟|的文本被删除。

您的尝试:

s = s.replaceAll("(\\[\\[)(.+)(\\|)(.+)(\\]\\])}", "$4"); 

中有一个},似乎是一个错字。如果你删除它,声明 将选择[[,后续文字,|,后续文字和]],并将整个匹配替换为|(第4组)之后的文字。也就是说,它会删除[[,内部文字的第一部分,|]],这与您想要的相反 - 您删除你想要保留的东西,主要是保留你想要删除的东西。

答案 3 :(得分:1)

您似乎正在寻找类似

的内容
replaceAll("\\[\\[([^|\\]]*\\|)?([^|\\]]*)]]", "[[$2]]")

此正则表达式将搜索

的数据
  • [[开头,以]]
  • 结尾
  • 并且在中间有可选的|或非]个字符,后面有管道(如Ubuntu (operating system)|),它们将被放置在第1组(不重要或以后使用)
  • 在关闭|之前放置的其他非]或非]]字符,例如Ubuntu]] - 此部分将放在第2组中,我们希望重复使用它在替代

所以您需要做的就是将[[]]替换为[[$2]]之间的第2组的部分。

演示:

String s = "sdfsdfsdf [[Ubuntu Touch]]: [[Ubuntu (operating system)|Ubuntu]] sdfspp";
System.out.println(s.replaceAll("\\[\\[([^|\\]]*\\|)?([^|\\]]*)]]", "[[$2]]"));

输出:sdfsdfsdf [[Ubuntu Touch]]: [[Ubuntu]] sdfspp

答案 4 :(得分:0)

Try this regex

(.+:\s\[\[)(.+)\|(.+)

它的工作原理如下:

String tem = "sdfsdfsdf [[Ubuntu Touch]]: [[Ubuntu (operating system)|Ubuntu]] sdfspp"; 
tem=tem.replaceAll("(.+:\\s\\[\\[)(.+)\\|(.+)","$1$3"); 
System.out.println(tem);

输出:

sdfsdfsdf [[Ubuntu Touch]]: [[Ubuntu]] sdfspp

<强>解释

(.+:\s\[\[) 

此部分找到一串字符(.+),后跟:,空格(\s)和两个大括号(\[\[)。然后将其分组到第一组$1

(.+)

此部分查找括号[[内但管道|之前的所有字符,并将其分组为$2

\|

此部分找到管道|

(.+)

此部分查找管道|之后的所有字符,并将其分组为$ 3。

作为返回值,您希望所有人都来自$1$3