Ruby 如何使用正则表达式搜索和替换?

Ruby 如何使用正则表达式搜索和替换?,ruby,regex,Ruby,Regex,我有一个字符串,比如: str = 'in europe it costs 250 eur' 或: 或: 或: 等等 我想将'eu'和'eur'替换为'euro',当它们后面和前面都是非字符([^a-z])时,但我不想让它们成为替换的受害者。如何使用sub或其他方法来实现这一点?首先,我们编译一个数组,用作测试用例集: test_input = ["aa 250 eu", "bb 250eu", "cc 250 euro", "dd 250euro", "ee e

我有一个字符串,比如:

str = 'in europe it costs 250 eur'
或:

或:

或:

等等


我想将
'eu'
'eur'
替换为
'euro'
,当它们后面和前面都是非字符(
[^a-z]
)时,但我不想让它们成为替换的受害者。如何使用
sub
或其他方法来实现这一点?

首先,我们编译一个数组,用作测试用例集:

test_input = ["aa 250 eu", "bb 250eu", "cc 250 euro", "dd 250euro", 
              "ee eu 250", "ff eu250",  "gg eur250",  "hh euro250"]
接下来,我们尝试使用regexp:

puts test_input.map { |s| 
  # First gsub handles eur before number, second gsub handles eur after number
  s.gsub(/(eu|euro?)\s?(\d+)/, 'euro \2').
    gsub(/(\d+)\s?(eu|euro?)(\z|\s)/, '\1 euro') 
}
说明:

  • \d+
    匹配一个或多个数字(数字)
  • \s?
    匹配零或1个空格
  • \z
    匹配字符串的结尾
结果:

aa 250 euro
bb 250 euro
cc 250 euro
xx 250 euro
dd euro 250
ee euro 250
ff euro 250

首先,我们编译一个数组,用作测试用例集:

test_input = ["aa 250 eu", "bb 250eu", "cc 250 euro", "dd 250euro", 
              "ee eu 250", "ff eu250",  "gg eur250",  "hh euro250"]
接下来,我们尝试使用regexp:

puts test_input.map { |s| 
  # First gsub handles eur before number, second gsub handles eur after number
  s.gsub(/(eu|euro?)\s?(\d+)/, 'euro \2').
    gsub(/(\d+)\s?(eu|euro?)(\z|\s)/, '\1 euro') 
}
说明:

  • \d+
    匹配一个或多个数字(数字)
  • \s?
    匹配零或1个空格
  • \z
    匹配字符串的结尾
结果:

aa 250 euro
bb 250 euro
cc 250 euro
xx 250 euro
dd euro 250
ee euro 250
ff euro 250

请添加一些“之前”和“之后”的示例,以便人们可以看到您到底在寻找什么。
(?-这将匹配任何不属于一个单词的
eu
eur
。但是所有
eu
eur
都在这个示例字符串
eu-djfhj eur-eu
@nhahdh我可以对nt'做一些解释吗?@Poochie:这是零宽度负向后看和负向前看。在谷歌上搜索那些e、 因为他们比我解释得更好。顺便说一句。@Poochie-一个快速玩和学习Ruby regexps的好地方:请添加一些前后示例,以便人们可以看到您到底在寻找什么。
(?-这将匹配任何不属于一个单词的
eu
eur
。但是所有
eu
eur
都在这个示例字符串
eu-djfhj eur-eu
@nhahdh我可以对nt'做一些解释吗?@Poochie:这是零宽度负向后看和负向前看。在谷歌上搜索那些e、 因为他们比我解释得更好。顺便说一句。@Poochie-一个快速玩和学习Ruby regexps的好地方:在我看来,这是一个部分解决方案,因为钱可能有小数点,也可能没有小数点(至少在一般文本中是如此)。“最多一个空格”这里有点严格。@nhahtdh它甚至可以使用小数点,因为
\d+
测试..这是一个方便的(预期的)副作用。但是如果有人写“foo.00eu”,那么它也会被转换..这可能是可取的,也可能是不可取的..@nhahtdh同意空格..可以更改为
\s{0,3}
例如,如果需要,甚至可以是
\s*
。不确定要求是什么。不过,第二步,您的小数点解可能就足够了。我可能想得太多了,因为我取了“56.”和“.34”作为需要考虑的案例,但我认为我在一般文本中看不到太多。在我看来,这是一个局部解决方案,因为钱可能有小数点,也可能没有小数点(至少在一般文本中)。这里的“最多一个空格”有点严格。@nhahdh由于
\d+
测试,它甚至可以使用小数点。。这是一个方便的(有意的)副作用。但是,如果有人写“foo.00eu”,那么它也会被转换。。这可能是可取的,也可能是不可取的。@nhahdh同意空格。。可以更改为
\s{0,3}
例如,如果需要,甚至可以是
\s*
。不确定要求是什么。不过,第二步,你的小数点解可能就足够了。我可能想得太多了,因为我把“56.”和“.34”作为要考虑的案例,但我认为我在一般文本中看不到太多。