Расщепление строки это только один способ манипулировать строковыми данными. Вы также можете сделать замены, чтобы заменить одну часть строки другой строкой. Например, в примере строки (foo, bar, baz) замена «foo» на «boo» приводит к «boo, bar, baz». Вы можете сделать это и многое другое, используя суб и GSUB Метод в классе строки.
Множество опций для замены рубина
Методы замещения бывают двух видов. суб Метод является самым основным из двух и имеет наименьшее количество сюрпризов. Он просто заменяет первый экземпляр назначенного шаблона заменой.
В то время как суб заменяет только первый экземпляр, GSUB Метод заменяет каждый экземпляр шаблона заменой. Кроме того, оба суб и GSUB иметь к югу! и GSUB! двойники. Помните, что методы в Рубин после этого восклицательный знак изменяет переменную на месте, а не возвращает измененную копию.
Поиск и замена
Основное использование методов замещения заключается в замене одной статической строки поиска одной статической строкой замены. В приведенном выше примере «foo» был заменен на «boo». Это можно сделать для первого появления «foo» в строке, используя
суб метод или со всеми вхождениями "foo", используя GSUB метод.#! / usr / bin / env ruby
a = "foo, bar, baz"
b = a.sub ("foo", "boo")
ставит б
$ ./1.rb
фу, бар, баз
gsub $ ./1.rb
бу, бар, баз
Гибкий поиск
Поиск статических строк может идти только так далеко. В конце концов, вы столкнетесь с случаями, когда подмножество строки или строки с дополнительными компонентами должны быть сопоставлены. Методы подстановки могут, конечно, соответствовать регулярным выражениям вместо статических строк. Это позволяет им быть более гибкими и соответствовать практически любому тексту, который вы можете придумать.
Этот пример немного более реальный мир. Представьте себе набор значений через запятую. Эти значения передаются в программу табулирования, которую вы не можете контролировать (закрыто источник). Программа, которая генерирует эти значения, также имеет закрытый исходный код, но выводит некоторые плохо отформатированные данные. В некоторых полях после запятой есть пробелы, и это приводит к разрыву программы табулятора.
Одно из возможных решений - написать программу на Ruby, которая будет действовать как «клей» или фильтр между двумя программами. Эта Ruby-программа исправит любые проблемы с форматированием данных, чтобы табулятор мог выполнять свою работу. Для этого все достаточно просто: замените запятую, за которой следует несколько пробелов, только запятой.
#! / usr / bin / env ruby
STDIN.each do | l |
l.gsub! (/, + /, ",")
ставит л
конец
gsub $ cat data.txt
10, 20, 30
12.8, 10.4,11
gsub $ cat data.txt | ./2.rb
10,20,30
12.8,10.4,11
Гибкие замены
Теперь представьте эту ситуацию. В дополнение к незначительному форматированию ошибкипрограмма, которая производит данные, производит числовые данные в научной нотации. Программа табулятора не понимает этого, поэтому вам придется ее заменить. Очевидно, что простой gsub здесь не подойдет, потому что замена будет отличаться каждый раз, когда замена выполняется.
К счастью, методы замещения могут принимать блок для аргументов замещения. Каждый раз, когда строка поиска обнаруживается, текст, соответствующий строке поиска (или регулярному выражению), передается в этот блок. Значение, полученное блоком, используется в качестве строки замещения. В этом примере число с плавающей запятой в форме научной нотации (например, 1.232e4) преобразуется в нормальное число с десятичной точкой. Строка преобразуется в число с to_fзатем число форматируется с использованием строки форматирования.
#! / usr / bin / env ruby
STDIN.each do | l |
l.gsub! (/-?\d+\.\d+e-?\d+/) do | n |
"% .3f"% n.to_f
конец
l.gsub! (/, + /, ",")
ставит л
конец
gsub $ cat floatdata.txt
2.215e-1, 54, 11
3.15668e6, 21, 7
gsub $ cat floatdata.txt | ./3.rb
0.222,54,11
3156680.000,21,7
Не знакомы с регулярными выражениями?
Давайте сделаем шаг назад и посмотрим на это регулярное выражение. Это выглядит загадочно и сложно, но очень просто. Если вы не знакомы с регулярными выражениями, они могут быть довольно загадочными. Однако, как только вы ознакомитесь с ними, они станут прямыми и естественными методами описания текста. Существует несколько элементов, и некоторые элементы имеют квантификаторы.
Основным элементом здесь является \ d класс персонажей. Это будет соответствовать любой цифре, символы от 0 до 9. Квантификатор + используется с классом цифр для обозначения того, что одна или несколько из этих цифр должны совпадать в строке. У вас есть три группы цифр, две разделены ".«а другой разделен буквой»е"(для экспоненты).
Вторым элементом, плавающим вокруг, является символ минус, который использует "?квантификатор. Это означает «ноль или один» из этих элементов. Короче говоря, в начале числа или показателя степени могут быть или не быть отрицательные знаки.
Два других элемента являются. (период) характер и е персонаж. Объедините все это, и вы получите регулярное выражение (или набор правил для сопоставления текста), которое соответствует числам в научной форме (например, 12.34e56).