我是正则表达式的新手,一直在尝试自己解决这个问题,但似乎无法正常工作。我有一个包含开始和结束标志的输入,我想替换某个字符,但前提是它位于标志之间。
例如,如果开始标志是 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 " "
最佳答案
查找START
和END
之间的所有字符,并将这些字符替换为\"
。
要实现此目的,请将替换函数应用于 START
和 END
之间的所有字符匹配:
string = Pattern.compile("(?<=START).*?(?=END)").matcher(string)
.replaceAll(mr -> mr.group().replace("\"", "\\\\\""));
它会产生您预期的输出。
关于其工作原理的一些说明。
第一步是匹配 START
和 END
之间的所有字符,它使用带有不情愿量词的环视:
(?<=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/