java - 如何使用正则表达式替换两个字符串之间的某个字符

标签 java regex replace regex-group regex-replace

我是正则表达式的新手,一直在尝试自己解决这个问题,但似乎无法正常工作。我有一个包含开始和结束标志的输入,我想替换某个字符,但前提是它位于标志之间。

例如,如果开始标志是 START,结束标志是 END,而我要替换的字符是“,我将用\”替换它

我会说 input.replaceAll(regex, '\\\"');

我尝试制作一个正则表达式来仅匹配正确的 "字符,但到目前为止我只能让它匹配标志之间的所有字符,而不仅仅是 "字符。 -> (?<=START)(.*)(?=END)

输入示例:

This " is START an " example input END string ""
START This is a "" second example END
This" is "a START third example END " "

预期输出:

This " is START an \" example input END string ""
START This is a \"\" second example END
This" is "a START third example END " "

最佳答案

查找STARTEND之间的所有字符,并将这些字符替换为\"

要实现此目的,请将替换函数应用于 STARTEND 之间的所有字符匹配:

string = Pattern.compile("(?<=START).*?(?=END)").matcher(string)
    .replaceAll(mr -> mr.group().replace("\"", "\\\\\""));

它会产生您预期的输出。

关于其工作原理的一些说明。

第一步是匹配 STARTEND 之间的所有字符,它使用带有不情愿量词的环视:

(?<=START).*?(?=END)

.* 之后的 ? 将匹配从贪婪(在仍然匹配的情况下尽可能多的字符)更改为不情愿(如 < em>少个字符,同时仍然匹配)。这可以防止更改以下输入中的中间引号:

START a"b END c"d START e"f END

贪婪量词将从第一个 START 一直匹配到下一个 END 到最后一个 END,错误地包含 c"d.

下一步是为每场比赛将 " 替换为 \"。完整匹配是第 0 组,或者只是 MatchResult#group。并且我们不需要正则表达式来进行此替换 - 只需简单的字符串替换就足够了(是的,replace() 替换所有出现的地方)。

关于java - 如何使用正则表达式替换两个字符串之间的某个字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73431083/

相关文章:

Java currentTimeMillis() 转换为秒不起作用?

mysql - 如果变量前有连字符,则 REGEXP 不匹配

python - 为什么replace()、re.sub() 或strip() 不能处理这个字符串?

java - 我做错了什么让我的应用程序在启动时运行?

java - 无法在 Spring Boot 项目中使用自定义 jar

java - 我如何在 Java 中为 Mule 以编程方式创建 ActiveMQ Producer?

python - Pandas:如何用另一个值替换 int 子字符串

javascript - jQuery 突出显示 href 值以外的单词

python -regex匹配单词列表

python - 使用 Python 替换字典中的缩写