【问题标题】:Matching and replacing patterns using regex [closed]使用正则表达式匹配和替换模式 [关闭]
【发布时间】:2013-05-14 10:30:18
【问题描述】:

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

  1. 单引号不在行首。
  2. 单引号不在行尾。
  3. 单引号前面没有逗号。
  4. 单引号后面没有逗号

例如 'a','b'c' 会变成 'a','b%27c'

我如何在 java 中做到这一点?

【问题讨论】:

  • 到目前为止你做了什么?您是否有我们可以开展工作并提供见解的起点?

标签: java regex


【解决方案1】:

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

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

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


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

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

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

如果你想要行首而不是字符串开始,你需要启用MULTILINE标志(?m),这使得^和@ 987654328@ 匹配一行的开头和结尾,而不是字符串的默认开头和结尾。例如:

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

【讨论】:

  • 你的意思是你的第一个表达式被否定,对吧? You have (?&lt;= 而不是 ?&lt;!...
  • @Floris: 不。它有一个非,,这意味着有一个前面的字符(因此不是字符串的开头),前面的字符不是,
  • 好吧,我想我没有意识到正面的后视不会匹配“无字符”(我认为“行首”不是逗号,所以会匹配)。谢谢!
  • 谢谢大家 - 这是有效的 - 它是!我失踪了
  • @RossFarrelly:请查看我的最新编辑。我不知道你是想要一行的开头还是字符串的开头。它们可能意味着不同的东西。
【解决方案2】:

使用负前瞻和后瞻的正则​​表达式对你有用:

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

【讨论】:

  • 可能会考虑分成一行来创建/编译正则表达式,以及应用它的行——如果没有别的,为了可读性...
猜你喜欢
  • 2022-11-24
  • 1970-01-01
  • 1970-01-01
  • 2023-03-26
  • 2013-04-16
  • 2012-05-16
  • 1970-01-01
  • 2022-01-03
相关资源
最近更新 更多