当前位置: 首页 > 面试题库 >

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

段干弘扬
2023-03-14
问题内容

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

在一部分中,我必须删除索引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)"


 类似资料:
  • 问题内容: 我有两个弦 和。现在,我想对这些字符串应用一个正则表达式,以过滤掉除数字以外的所有内容,以便获得像和这样的整数。 我该怎么做? 问题答案: 您可以使用。它会考虑您所拥有的一切之外的一切。 因此,如果要过滤除y以外的所有内容。在你的情况下,你会做类似的事情 其中string是保存实际文本的变量!

  • 问题内容: 我需要删除字符串中的一些子字符串(在大型数据集中)。该 子常常包含特殊字符,像这样的:,^,/,…和 的replaceAll()将它们视为对正则表达式的特殊字符,如点 会匹配任何字符,这是不是我真正想要的东西。 是否有其他函数可以执行“替换”而不将第一个 参数视为正则表达式? 问题答案: 只需使用String.replace()。它的功能相同,但是它 内部处理了特殊字符的转义,以避免您

  • 我正在尝试用Java编写一个正则表达式,它从段落中删除所有非字母数字字符,但单词之间的空格除外。 如何修复此错误?

  • 问题内容: 如何在Java中从给定的字符串中删除所有方括号(“ []”)? 在这种情况下将使用什么正则表达式? 问题答案: 使用这个:

  • 问题内容: 假设我想使用正则表达式删除字符串中的所有重复字符(特定字符)。这很简单- 如果我想用相应的字符替换所有重复的字符(即a,z)怎么办?我该怎么做呢? 注意: 我知道可以使用哈希表或某些O(n ^ 2)算法更好地解决这种删除重复项的方法,但是我想使用正则表达式进行探索 问题答案: 的周围的指定 捕获组 ,然后将(一个 反向引用 在图案和替换两者)指的是第一个捕获组的内容。 因此,正则表达式

  • 问题内容: 我是正则表达式的新手,并且想知道如何才能只获取字符串中的第一个数字,例如。在这种情况下,我希望它返回,但是数字也可以更短或更长时间。 我在考虑类似的东西,但它会将每个数字分别分开(100,2001,10,…) 谢谢。 问题答案: 尝试以下操作以匹配字符串中的第一个数字(该数字不能位于字符串的开头):