我想用 %27 替换字符串中的某些单引号。单引号必须满足以下条件
- 单引号不在行首。
- 单引号不在行尾。
- 单引号前面没有逗号。
- 单引号后面没有逗号
例如 'a','b'c' 会变成 'a','b%27c'
我如何在java中做到这一点?
忽略您选择正则表达式执行此任务的原因,您可以使用以下正则表达式:
"(?<=[^,])'(?=[^,])"
请注意,第一个解决方案假定输入不包含任何换行符,这使得行的开始和结束有效地开始和结束整个字符串。如果假设不适用,即输入包含换行符,请使用第二种解决方案。
或更长的版本(这假设您的输入字符串中没有换行符):
"(?<!^)(?<!,)'(?!$|,)"
我分开了 2 个后视,因为Java 1.5 和 1.4.2 中有一个错误会影响后视交替。如果您打算仅支持 Java 1.6 及更高版本,则可以将 2 个后视功能组合在一起(?<!^|,)
。
如果您想要行的开头而不是字符串的开头,则需要启用MULTILINE
标志(?m)
,它会生成^
并$
匹配行的开头和结尾,而不是默认的字符串的开头和结尾。例如:
"(?m)(?<!^)(?<!,)'(?!$|,)"
使用负前瞻和后瞻的正则表达式对您有用:
String repl = "'a','b'c'".replaceAll("(?<!(^|,))'(?!(,|$))", "%27");
// 'a','b%27c'