|
Тема |
Регулярни изрази. [re: Учeщ] |
|
Автор |
Учeщ (скромен тип) |
|
Публикувано | 09.12.06 15:26 |
|
|
Нека направим заедно една много интересна програма. Този път ще проверяваме
дали стринга отговаря на условие, описано в шаблон.
Съществуват символи и комбинации от символи в тези шаблони, които имат
специално значение:
[] - определя обхват. Например [a-z] означава буква във обхвата от
a до z.
\w - буква или цифра. Същото като [0-9A-Za-z].
\W - нито буква нито цифра.
\s - whitespace (за празно поле) символ. Същото като [ \t\n\r\f].
\S - символ, който не е whitespace.
\d - цифров символ. Същото като [0-9].
\D - Не цифров символ.
\b - backspace (0x08). Единствено ако е в range specification (спецификация на обхват).
\b - граница на дума. Ако не е в range specification (спецификация на обхват).
\B - символ, който не е граница на дума.
* - Нула или повече повторения на предишното.
+ - Едно или повече повторения на предишното.
{m,n} - Най-малко m и най-много n повторения на предишното.
? - Най-малко 0 и най-много един път повторения на предишното. Същото като
{0,1}.
| - Отговаря на предишният или следващият израз. (alternation)
() - групиране.
Общото название на шаблоните, които използват тази странна азбука
е регулярни изрази (regular expressions). В Руби, както и в Perl и
JavaScript те са в повечето случаи се обграждат със наклонени черти
(forward slashes) внести двоини кавички. Ако никога не си работил
със регулярни изрази те изглеждат всичко друго но не и "регулярни"
(правилни). Ще бъде умно, обаче да загубиш време и да се запознаем с тях.
Те са изключително мощни и ще ти спестят главоболия (и много редове код),
когато е необходимо да сравняваш низове, да търсиш в тях или да
извършваш други операзии със стрингове.
Например нека предположим че искаме да проверим дали стринга
отговаря на това условие: "Започва с малка буква f, която веднага
е следвана от точно една главна буква. След това не е задължително
но може да има разни символи, които не са малки букви тези символи
се повтарят докато не се среще малка буква. За да направим това в
Руби единственото, което трябва да направим е да сравним стринга
с регулярният израз /^f[A-Z][^a-z]*$/.
Как да проверим за "шеснаисетично число затворено в ъглови скоби"?
Няма проблеми.
C:\ruby\samples\RubySrc-1.8.5\sample>ruby eval.rb
ruby> def chab(s) # "sudurja hex v schupeni skobi"
ruby| (s =~ /<0(x|X)(\d|[a-f]|[A-F])+>/) != nil
ruby| end
nil
ruby> chab "OK, tova: <0xfc0004>."
true
ruby> chab "Ne tova."
false
ruby> chab "Ili tova? <0x38z7e>"
false
ruby> chab "Moje bi tova? {0x35}" # greshen tip skobi
false
ruby> exit
"=~" е оператор за сравнение, който се отнася за регулярните изрази.
Тои връща позицията в стринга където е било открито съвпадение или
nil ако не е било открито. Бележка за хората, който са по advanced
с регулярните изрази - Ruby не поддържа lookbehind.
|
| |
|
|
|