【问题标题】:Replace multiple instances of a character within matching group替换匹配组中字符的多个实例
【发布时间】:2018-09-08 13:24:46
【问题描述】:

我正在尝试编写一个 regexp_replace 来用分号 (;) 替换方括号内的逗号 (,) 分隔符。

输入字符串:

gc:network,sm:Out of stock,fm:[PUT,Free store pickup today,S2H],pb:[Rollback,Test]

预期输出:

gc:network,sm:Out of stock,fm:[PUT;Free store pickup today;S2H],pb:[Rollback;Test]

任何帮助将不胜感激!

【问题讨论】:

  • CSV 字符串中可以出现多少个带括号的术语?
  • 一到五个是我迄今为止在数据中看到的
  • 使用"(\\G(?!^)|\\[)([^,\\]\\[]*)," 并替换为"$1$2;"
  • @WiktorStribiżew 输出有一些问题,它消除了第二个分隔符并在开头添加了一个额外的分隔符。这是输出:gc:network,sm:Out of stock,fm:[;PUT;Free store pickup todayS2H],pb:[Rollback;Test]
  • 不能,见the regex demo。您一定丢失了部分正则表达式或替换。

标签: regex hive


【解决方案1】:

如果您的正则表达式支持前瞻和后瞻,您可以尝试:

(?<=\[[^\]]*),(?=[^\[]*\])

看这里:regexr,还有正则表达式的解释。

如 cmets 中所述,Java 不支持无限宽度的后视。您可以将输入长度设置为限制,例如如果是 1000,这将起作用:

(?<=\[[^\]]{0,1000}),(?=[^\[]*\])

【讨论】:

  • 它说here Hive 的 regexp_replace 使用 Java 正则表达式语法,而 AFAIK,Java 正则表达式引擎不支持无限宽度 Lookbehinds。
  • 好的。谢谢!我想您可以将输入长度设置为限制。例如。 (?&lt;=\[[^\]]{0,10000}),(?=[^\[]*\]) 在 Java 中工作。
  • @ArunC 非常适合您! :) 请考虑接受答案,因为这是该平台运作方式的一部分。
  • @morja 我在测试解决方案后不久就这样做了。由于我的声望点少于 15,平台不会显示我的 +1。
  • @ArunC 好的 :) 我不知道。我认为您至少应该能够接受答案。但这一切都很好。只是想提一下。
猜你喜欢
  • 2018-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-14
  • 2014-03-12
  • 2013-10-26
  • 1970-01-01
相关资源
最近更新 更多