使用正则表达式匹配和替换模式

时间:2013-05-14 02:08:05

标签: java regex

我想用%27替换字符串中的某些单引号。单引号必须符合以下条件

  1. 单引号不在行的开头。
  2. 单引号不在行尾。
  3. 单引号前面没有逗号。
  4. 单引号后面没有逗号
  5. 例如'a','b'c'将成为'a','b%27c'

    我如何在java中执行此操作?

2 个答案:

答案 0 :(得分:3)

忽略您选择正则表达式执行此任务的原因,您可以使用以下正则表达式:

"(?<=[^,])'(?=[^,])"

请注意,第一个解决方案假设输入不包含任何新行字符,这使得行的开头和结尾有效地开始和结束整个字符串。如果假设不适用,即输入包含换行符,请使用第二种解决方案。


或更长的版本(此假设输入字符串中没有换行符):

"(?<!^)(?<!,)'(?!$|,)"

我分开了2个后卫,因为有a bug in Java 1.5 and 1.4.2 that affects look-behind with alternation。如果您打算仅支持Java 1.6及更高版本,则可以将两个后置组合在一起(?<!^|,)

如果您希望行首而不是字符串的开头,则需要启用MULTILINE标记(?m),这会使{ {1}}和^匹配行的开头和结尾,而不是字符串的默认开头和结尾。例如:

$

答案 1 :(得分:1)

使用负向前瞻和后瞻的正则​​表达式适用于您:

String repl = "'a','b'c'".replaceAll("(?<!(^|,))'(?!(,|$))", "%27");
// 'a','b%27c'