我正在尝试解决 codingbat使用正则表达式的问题,无论它是否适用于网站。
到目前为止,我有以下代码,它没有在两个连续的相等字符之间添加 *
。相反,它只是推平它们并用一组字符串替换它们。
public String pairStar(String str) {
Pattern pattern = Pattern.compile("([a-z])\\1", Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher(str);
if(matcher.find())
matcher.replaceAll(str);//this is where I don't know what to do
return str;
}
我想知道如何继续使用正则表达式并替换整个字符串。如果需要,我认为递归系统会有所帮助。
最佳答案
这个有效:
while(str.matches(".*(.)\\1.*")) {
str = str.replaceAll("(.)\\1", "$1*$1");
}
return str;
正则表达式的解释:
搜索正则表达式(.)\\1
:
(.)
表示“任何字符”(.
),括号创建一个组 - 第 1 组(第一个左括号)\\1
,在正则表达式中是\1
(java 文字String
必须用另一个反斜杠转义一个反斜杠)表示“第一组”——这种术语称为“反向引用”
所以一起 (.)\1
表示“任何重复的字符”
替换正则表达式 $1*$1
:
$1
术语表示“作为第 1 组捕获的内容”
递归解决方案:
从技术上讲,该站点上要求的解决方案是递归解决方案,因此这里是递归实现:
public String pairStar(String str) {
if (!str.matches(".*(.)\\1.*")) return str;
return pairStar(str.replaceAll("(.)\\1", "$1*$1"));
}
关于java - 使用正则表达式用修改后的字符替换字符串中的序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13735292/