【问题标题】:Simple regex replacement using joined string使用连接字符串进行简单的正则表达式替换
【发布时间】:2021-08-31 07:41:00
【问题描述】:

我有以下代码:

vars=["aaa","bbb","ccc"].join("|");
str="aaa has bbb has ccc"

# attempt ont
result = str.gsub(/+vars+/,"hello")

# attempt two
result = str.gsub("/"+vars+"/","hello")
puts result

如何将vars 的内容放入正则表达式中,以用hello 替换所有实例?

【问题讨论】:

  • 你的意思是result = str.gsub(Regexp.new(vars), "hello")?
  • @WiktorStribiżew 是的,我刚刚意识到我做错了什么谢谢。
  • @WiktorStribiżew:更好,Regexp.new(Regexp.union(["aaa","bbb","ccc"].map{|s| Regexp.escape(s)}))
  • @SergioTulentsev 你能在答案中解释这个解决方案吗?
  • 正则表达式文字也处理插值,因此更接近您的初始设计的解决方案是/#{vars}/

标签: regex ruby


【解决方案1】:

首先想到的是使用Regexp.new 来初始化正则表达式或在/.../ 中使用#{string}:

str.gsub(Regexp.new(vars), "hello")
str.gsub(/#{vars}/, "hello")

见this online Ruby demo。 然而,这只是将vars 内容放入正则表达式中。

您可以使用Regexp.union 创建一个正则表达式并自动转义模式中的所有特殊正则表达式元字符:

vars = ["aa+a","bbb","ccc"]
p Regexp.union(vars)
# => /aa\+a|bbb|ccc/

如果您需要在更长的正则表达式中使用这种替换,您可以使用

p /LEFT_PART...(?:#{Regexp.union(vars).source})...RIGHT_PART/
# => /LEFT_PART...(?:aa\+a|bbb|ccc)...RIGHT_PART/

请注意,Regexp.union(vars).source 只会返回没有修饰符组且开头设置或未设置正则表达式标志的模式(否则,它看起来像 (?-mix:aa\+a|bbb|ccc))。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-27
    • 1970-01-01
    • 2011-10-05
    • 2018-07-13
    • 2015-11-30
    • 2021-11-29
    相关资源
    最近更新 更多