gpt4 book ai didi

ruby-on-rails - 使用正则表达式数组转换 Ruby w/`gsub` 中的字符串

转载 作者:太空宇宙 更新时间:2023-11-03 16:13:04 25 4
gpt4 key购买 nike

我有一个字符串,我想使用 Ruby 的 gsub 和一大堆正则表达式及其在数组数组中产生的转换来转换它。

我喜欢做这样的事情:

MY_REGEXPS = [
[
/^(\d-\d:) (SINGLE|DOUBLE|TRIPLE)/,
proc { "#{$1} #{$2.capitalize}," }
],
#....Many for regexp/transformation pairs
]

my_string = "0:0 SINGLE (Line Drive, 89XD)"

MY_REGEXPS.inject(my_string) do |str, regexp_pair|
str.gsub(regexp_pair.first, &regexp_pair.last)
end

但是,proc 未绑定(bind)到 gsub 匹配的上下文,因此 $1$2 等变量不可用。我还确认,如果我只是在正常调用 gsub 的过程中使用正则表达式/转换,例如:

my_string.gsub(/^(\d-\d:) (SINGLE|DOUBLE|TRIPLE)/) do
"#{$1} #{$2.capitalize},"
end

代码工作得很好。

谁能告诉我一种方法,让我将该过程绑定(bind)到 gsub 的上下文,以便我可以访问 $1$2

谢谢

最佳答案

也许以下内容或变体可以满足您的需求。

MY_REGEXPS = [
[
/^(\p{L}+) (\d:\d) (SINGLE|DOUBLE|TRIPLE) \1/i,
proc { |_,v2,v3| "#{v2} #{v3.capitalize}," }
],
]

my_string = "dog 1:2 single dog (Line Drive, 89XD)"

MY_REGEXPS.inject(my_string) do |s,(re,p)|
p.call(*s.match(re).captures)
end
#=> "1:2 Single,"

我包含了捕获组 #1 (\p{L}+)(匹配一个或多个字母)以显示如何包含与 proc 计算无关的捕获组, 但是 MatchData#captures仍然可以传递给 proc。 (此处使用捕获组 #1 以确保该捕获组的内容再次出现在字符串中的指定位置 (\1))。

关于ruby-on-rails - 使用正则表达式数组转换 Ruby w/`gsub` 中的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55958196/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com