我有这个功课问题,我需要使用正则表达式删除字符串中的所有其他字符.
在一个部分中,我必须删除索引1,3,5处的字符,...我已按如下方式执行此操作:
String s = "1a2b3c4d5";
System.out.println(s.replaceAll("(.).", "$1"));
Run Code Online (Sandbox Code Playgroud)
这打印12345出我想要的东西.基本上我一次匹配两个字符,并替换为第一个字符.我使用群组捕获来做到这一点.
问题是,我在作业的第二部分遇到问题,我需要删除索引0,2,4处的字符,...
我做了以下事情:
String s = "1a2b3c4d5";
System.out.println(s.replaceAll(".(.)", "$1"));
Run Code Online (Sandbox Code Playgroud)
这打印abcd5,但必须正确答案abcd.如果输入字符串长度为奇数,则我的正则表达式只是不正确.如果它是偶数,那么我的正则表达式工作正常.
我想我真的很接近答案,但我不确定如何解决它.
pol*_*nts 19
你确实非常接近答案:只需匹配第二个char可选.
String s = "1a2b3c4d5";
System.out.println(s.replaceAll(".(.)?", "$1"));
// prints "abcd"
Run Code Online (Sandbox Code Playgroud)
这是因为:
"null"Matcher.group(int)返回不同null让我们仔细看看作业的第一部分:
String s = "1a2b3c4d5";
System.out.println(s.replaceAll("(.).", "$1"));
// prints "12345"
Run Code Online (Sandbox Code Playgroud)
在这里你不必使用?第二个字符,但它"有效",因为即使你没有匹配最后一个字符,你也没必要!由于问题规范,最后一个字符可以保持不匹配,未替换.
现在假设我们要删除索引1,3,5 ...处的字符,并将字符放在索引0,2,4 ...括号中.
String s = "1a2b3c4d5";
System.out.println(s.replaceAll("(.).", "($1)"));
// prints "(1)(2)(3)(4)5"
Run Code Online (Sandbox Code Playgroud)
A-HA!现在你遇到了与奇数长度输入完全相同的问题!您无法将最后一个字符与正则表达式匹配,因为正则表达式需要两个字符,但最后只有一个字符用于奇数长度输入!
解决方案同样是使第二个char匹配可选:
String s = "1a2b3c4d5";
System.out.println(s.replaceAll("(.).?", "($1)"));
// prints "(1)(2)(3)(4)(5)"
Run Code Online (Sandbox Code Playgroud)