我在java中有以下字符串。
"sdfsdfsdf [[Ubuntu Touch]]: [[Ubuntu (operating system)|Ubuntu]] sdfspp"
我想使用String#replaceAll(regex)
来获取以下内容
"sdfsdfsdf [[Ubuntu Touch]]: [[Ubuntu]] sdfspp"
我试过
s = s.replaceAll("(\\[\\[)(.+)(\\|)(.+)(\\]\\])}", "$4");
没有成功
任何帮助?
感谢。
答案 0 :(得分:2)
这适用于我(对于给定的字符串):
s = s.replaceAll("(\\[\\[)([^\\[\\]]+)(\\|)([^\\[\\]]+)(\\]\\])", "[[$4]]");
答案 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)
(.+:\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
。