【发布时间】:2013-05-14 10:30:18
【问题描述】:
我想用 %27 替换字符串中的某些单引号。单引号必须满足以下条件
- 单引号不在行首。
- 单引号不在行尾。
- 单引号前面没有逗号。
- 单引号后面没有逗号
例如 'a','b'c' 会变成 'a','b%27c'
我如何在 java 中做到这一点?
【问题讨论】:
-
到目前为止你做了什么?您是否有我们可以开展工作并提供见解的起点?
我想用 %27 替换字符串中的某些单引号。单引号必须满足以下条件
例如 'a','b'c' 会变成 'a','b%27c'
我如何在 java 中做到这一点?
【问题讨论】:
忽略您选择正则表达式执行此任务的原因,您可以使用以下正则表达式:
"(?<=[^,])'(?=[^,])"
请注意,第一个解决方案假设输入不包含任何换行符,这使得行的开始和结束实际上是整个字符串的开始和结束。如果假设不适用,即输入包含换行符,请使用第二种解决方案。
或更长的版本(这假设您的输入字符串中没有换行符):
"(?<!^)(?<!,)'(?!$|,)"
我分开了 2 个后视,因为有 a bug in Java 1.5 and 1.4.2 that affects look-behind with alternation。如果您打算仅支持 Java 1.6 及更高版本,您可以将 2 个后视功能组合在一起 (?<!^|,)。
如果你想要行首而不是字符串开始,你需要启用MULTILINE标志(?m),这使得^和@ 987654328@ 匹配一行的开头和结尾,而不是字符串的默认开头和结尾。例如:
"(?m)(?<!^)(?<!,)'(?!$|,)"
【讨论】:
You have (?<= 而不是 ?<!...
,,这意味着有一个前面的字符(因此不是字符串的开头),前面的字符不是,。
使用负前瞻和后瞻的正则表达式对你有用:
String repl = "'a','b'c'".replaceAll("(?<!(^|,))'(?!(,|$))", "%27");
// 'a','b%27c'
【讨论】: