使用Java正则表达式删除字符串中的所有其他字符

我有这个作业问题,需要使用正则表达式删除字符串中的所有其他字符。

在一部分中,我必须删除索引1,3,5,…处的字符,具体操作如下:

String s = "1a2b3c4d5";

System.out.println(s.replaceAll("(.).", "$1"));

12345是我想要的打印。本质上,我一次匹配两个字符,然后替换为第一个字符。我使用组捕获来做到这一点。

问题是,我在作业的第二部分遇到麻烦,我需要删除索引0、2、4,…处的字符。

我已经完成以下工作:

String s = "1a2b3c4d5";

System.out.println(s.replaceAll(".(.)", "$1"));

此打印abcd5,但正确答案必须是abcd。仅当输入字符串的长度为奇数时,我的正则表达式才不正确。如果是偶数,则我的正则表达式可以正常工作。

我认为我真的很接近答案,但是我不确定如何解决它。

回答:

您确实非常接近答案:只需将匹配第二个字符作为可选字符即可。

String s = "1a2b3c4d5";

System.out.println(s.replaceAll(".(.)?", "$1"));

// prints "abcd"

之所以有效,是因为:

  • 正则表达式默认是贪婪的,如果有则使用第二个字符

    • 当输入的长度为奇数时,第二个字符将在最后一次替换时不存在,但您仍将匹配一个字符(即输入中的最后一个字符)

  • 即使组不匹配,您仍然可以使用反向引用进行替换

    • 它将替换为空字符串,而不是 "null"
    • 这与不同Matcher.group(int),后者会null为失败的组返回

参考文献

  • regular-expressions.info/可选


仔细看看第一部分

让我们仔细看看作业的第一部分:

String s = "1a2b3c4d5";

System.out.println(s.replaceAll("(.).", "$1"));

// prints "12345"

在这里,您不必使用?第二个字符,但是它“有效”,因为即使您不匹配最后一个字符, 也不必使用!

由于问题说明,最后一个字符可以保持不匹配,无法替换的状态。

现在假设我们要删除索引为1,3,5 …的字符,并将索引为0,2,4 …的字符放在方括号中。

String s = "1a2b3c4d5";

System.out.println(s.replaceAll("(.).", "($1)"));

// prints "(1)(2)(3)(4)5"

哈!现在,您在使用奇数长度输入时遇到了完全相同的问题!您无法将最后一个字符与您的正则表达式匹配,因为您的正则表达式需要两个字符,但最后一个字符用于奇数长度输入!

同样,解决方案是使匹配第二个char为可选:

String s = "1a2b3c4d5";

System.out.println(s.replaceAll("(.).?", "($1)"));

// prints "(1)(2)(3)(4)(5)"

以上是 使用Java正则表达式删除字符串中的所有其他字符 的全部内容, 来源链接: utcz.com/qa/431319.html

回到顶部