我刚开始使用正则表达式,一直在try 自己解决这个问题,但我似乎不能让它正常工作.我有一个包含开始标志和结束标志的输入,我想替换某个字符,但前提是它在标志之间.

例如,如果开始标志是开始标志,结束标志是结束标志,我try 替换的字符是"而我将用\"替换它

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

我try 使正则表达式只匹配正确的"字符",但到目前为止,我只能匹配标志之间的所有字符,而不仅仅是"字符".-&gt;(?<=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之间的所有字符,它使用具有reluctant限定符的Look Around:

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

.*之后的?将匹配从贪婪(仍然匹配时尽可能使用many个字符)更改为不情愿(仍然匹配时尽可能使用few个字符).这样可以防止更改以下输入中的中间引号:

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

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

下一步是对于每一场比赛,用\"替换".完全匹配的是0组,或者说只有MatchResult#group组.我们不需要正则表达式来进行这种替换--只需替换普通字符串就足够了(是的,replace()次替换了all次).

Java相关问答推荐

如何在Java中对自定义协议进行主机名验证?

无法在Java中将hhmmss格式的时间解析为LocalTime

我可以在regex中的字符类中放置断言吗?

我可以从Java模块中排除maven资源文件夹吗?

更新我们的一个文物后出现了严重的符号引用错误

如何审查Java dtos中的自定义注释字段?

Java:根据4象限中添加的行数均匀分布行的公式

inteliJ中是否有一个功能可以自动在块注释中的/*后面添加一个空格?''

Quarkus keycloat配置不工作.quarkus. keycloak. policy—enforcer. enable = true在. yaml表示中不工作

使用java访问具体子类特定方法的最佳方法是什么?

按属性值从流中筛选出重复项

如何修复PDF重建过程中的文本定位

Jolt变换JSON数组问题

如何从日期中截取时间并将其传递给组件?

Java页面筛选器问题

在settings.gradle.kts和Build.gradle.kts中使用公共变量

在一行中检索字符分隔字符串的第n个值

在Eclipse中可以使用外部字体吗?

如何通过用户ID向用户发送私信

java21预览未命名的符号用于try-with-resources