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+
匹配零或1个空格\s?
匹配字符串的结尾\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+
匹配零或1个空格\s?
匹配字符串的结尾\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”作为要考虑的案例,但我认为我在一般文本中看不到太多。