Как да използвате String Substitution в Ruby

Разделяне на низ е само един начин за манипулиране на низови данни. Можете също да направите замествания, за да замените една част от низ с друга. Например, в примерен низ (foo, bar, baz) замяната на „foo“ с „boo“ в ще даде „boo, bar, baz“. Можете да направите това и много други неща, като използвате подводница и gsub метод в низовия клас.

Много опции за замяна на Ruby

Методите за заместване се предлагат в две разновидности. Най- подводница методът е най-основният от двете и идва с най-малък брой изненади. Той просто замества първия екземпляр от определения модел със заместващия.

докато подводница замества само първата инстанция, the gsub метод замества всеки екземпляр от шаблона със замяната. Освен това и двете подводница и gsub имам суб! и gsub! колеги. Запомнете, методите в рубин този край в удивителен знак променя променливата на мястото си, вместо да връща модифицирано копие.

Търсете и заменете

Най-основното използване на методите за заместване е да се замени един статичен низ за търсене с един статичен заместващ низ. В горния пример „foo“ беше заменен с „boo“. Това може да се направи за първото възникване на "foo" в низа с помощта на

instagram viewer
подводница метод или с всички случаи на "foo" с помощта на gsub метод.

#! / usr / bin / env рубин
a = "foo, bar, baz"
b = a.sub ("foo", "boo")
поставя б
$ ./1.rb
foo, bar, baz
gsub $ ./1.rb
бу, бар, баз

Гъвкаво търсене

Търсенето на статични низове може да стигне само дотук. В крайна сметка ще попаднете на случаи, в които подмножество от струни или струните с незадължителни компоненти ще трябва да бъдат съпоставени. Методите за заместване, разбира се, могат да съответстват на регулярни изрази вместо статични низове. Това им позволява да бъдат много по-гъвкави и да съвпадат почти с всеки текст, който можете да сънувате.

Този пример е малко по-реален свят. Представете си набор от стойности, разделени със запетая. Тези стойности се въвеждат в таблична програма, над която нямате контрол (затворена) източник). Програмата, която генерира тези стойности, също е затворен източник, но извежда някои данни с лошо форматиране. Някои полета имат интервали след запетаята и това води до прекъсване на програмата на табулатора.

Едно възможно решение е да напишете програма Ruby, която да действа като "лепило" или филтър между двете програми. Тази програма Ruby ще отстрани всички проблеми във форматирането на данни, така че табулаторът да си върши работата. За да направите това, е съвсем просто: заменете запетая, последвано от редица интервали, само със запетая.

#! / usr / bin / env рубин
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 рубин
STDIN.each do | l |
l.gsub! (/-?\d+\.\d+e-?\d+/) направи | 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

Не сте запознати с редовните изрази?

Нека направим крачка назад и да разгледаме това редовен израз. Изглежда загадъчно и сложно, но е много просто. Ако не сте запознати с регулярните изрази, те могат да бъдат доста загадъчни. Въпреки това, след като сте запознати с тях, те са ясни и естествени методи за описание на текст. Има редица елементи, а няколко от елементите имат количествени характеристики.

Основният елемент тук е клас на знаците. Това ще съответства на всяка цифра, знаците от 0 до 9. Кванторът + се използва с класата на цифри от знаци, за да означава, че една или повече от тези цифри трябва да бъдат съпоставени в ред. Имате три групи цифри, две разделени с ".", а другото разделено с буквата"д"(за експонент).

Вторият плаващ елемент е минус символът, който използва символа "?"количествен показател. Това означава "нула или един" от тези елементи. Така че накратко, в началото на числото или показателя може да има или да няма отрицателни знаци.

Другите два елемента са. (период) характер и д характер. Комбинирайте всичко това и получавате редовен израз (или набор от правила за съвпадение на текст), който съвпада с числата в научна форма (например 12.34e56).