2012-06-08 2 views
1

У меня есть строка, как:Как использовать поиск и замену регулярных выражений?

str = 'in europe it costs 250 eur' 

или:

str = 'in europe it costs a lot (250eu)' 

или:

str = 'eureka! I found it and it costs eu250' 

или:

str = 'eureka! I found it and it costs 250.00eur' 

и так далее ..

Я хочу заменить как 'eu', так и 'eur' с 'euro', когда им следуют и предшествует не-char ([^a-z]), но я не хочу, чтобы они стали жертвами замены. Как это сделать, используя sub или другие методы?

+1

Пожалуйста, добавьте некоторые примеры до и после, чтобы люди могли видеть, что именно вы ищете. – Casper

+0

Отредактировано! @Casper – Poochie

+0

'(? nhahtdh

ответ

1

Сначала мы составляем массив, мы используем в качестве набора тестов:

test_input = ["aa 250 eu", "bb 250eu", "cc 250 euro", "dd 250euro", 
       "ee eu 250", "ff eu250", "gg eur250", "hh euro250"] 

Далее мы опробовать регэкспы:

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? соответствует нулю или 1 пробельному
  • \z спичек конца строки

Результат:

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

Это частичное решение IMO, поскольку деньги могут иметь или не иметь десятичную точку (по крайней мере, в общем тексте). «Не более одного пространства» здесь немного строгий. – nhahtdh

+0

@nhahtdh Он работает даже с десятичными точками из-за '\ d +' test ... это удобный (предполагаемый) побочный эффект. Однако, если кто-то пишет «foo.00 eu», то это тоже будет конвертировано .., что может быть желательно или нет ... – Casper

+0

@nhahtdh Согласитесь о пространстве .. может быть изменено на '\ s {0,3}' например, или даже '\ s *", если это необходимо. Не уверен, что такое требование. – Casper

Смежные вопросы