» Главная
eXcode.ru » Статьи » Ruby
» Новости
» Опросы
» Файлы
» Журнал



Пользователей: 0
Гостей: 4





Регулярные выражения




Давайте-ка скомпонуем более интересную программу. На этот раз мы будем проверять, удовлетворяет ли строка некоторому набору свойств, который мы будем называть шаблоном.

Вот некоторые из символов и их сочетаний, которые имеют специальное значение при использовании в шаблонах:

[]


задание диапазона (т.е., [a-z] означает букву в пределах от a до z)

\w


буква либо цифра; то же, что и [0-9A-Za-z]

\W


ни буква, ни цифра

\s


символ пробела; то же, что и [ \t\n\r\f]

\S


не пробел

\d


символ цифры; то же, что и [0-9]

\D


не цифра

\b


забой (0x08) (только если в пределах заданного диапазона)

\b


граница слова (только если в пределах заданного диапазона)

\B


не граница слова

*


ноль или более повторений предыдущего

+


один или более повторений предыдущего

{m,n}


минимум m и максимум n повторений предыдущего

?


не более одного повторения предыдущего; то же самое, что и{0,1}

|


совпадение предыдущего либо последующего условия

()


группировка

Общепринятый термин для шаблонов, которые используют этот странный вокабуляр - регулярные выражения. В Ruby, как и в Perl, они обычно окружаются прямыми слэшами, а не двойными кавычками. Если Вы никогда раньше не работали с регулярными выражениями, они кажутся какими угодно, только не регулярными; тем не менее было бы мудро потратить некоторое количество времени на близкое знакомство с ними. Они дают краткую и выразительную мощь, которая освободит Вас от головной боли (и написания многих строк кода) в тех случаях, когда необходимо произвести определение соответствия шаблону, поиск и другие манипуляции над текстовыми строками.

Пусть, например, мы хотим проверить, удовлетворяет ли строка следующему описанию: "Начинается с f в нижнем регистре, сразу за ней следует Буква в верхнем регистре, потом что угодно, при условии, что буквы в нижнем регистре отсутствуют." Если Вы опытный программист на С, то Вы уже, вероятно, написали в своей голове примерно дюжину строк кода, так?? Поверьте, это едва ли поможет Вам. Но в Ruby Вам нужен всего лишь один запрос на соответствие строки регулярному выражению /^f[A-Z][^a-z]*$/.

А как насчет "Содержит шестнадцатеричное число, заключенное в угловые скобки?" Пожалуйста:



ruby> def chab (s) # "contains hex in angle brackets"

| (s =~ /<0[Xx][\dA-Fa-f]+>/) != nil

| end

nil

ruby> chab "Not this one."

false

ruby> chab "Maybe this? {0x35}" # wrong kind of brackets

false

ruby> chab "Or this? <0x38z7e>" # bogus hex digit

false

ruby> chab "Okay, this: <0xfc0004>."

true

Хотя регулярные выражения могут с первого взгляда вызывать недоумение, озадачивать, Вы быстро начнете получать удовлетворение от возможности выражаться столь экономно.

Вот маленькая программа, чтобы помочь Вам поэкспериментировать с регулярными выражениями. Запишите ее как regx.rb и запустите командой "ruby regx.rb" в командной строке.



# Необходим терминал с поддержкой ANSI !



st = "\033[7m"

en = "\033[m"



while TRUE

print "str> "

STDOUT.flush

str = gets

break if not str

str.chop!

print "pat> "

STDOUT.flush

re = gets

break if not re

re.chop!

str.gsub! re, "#{st}\\&#{en}"

print str, "\n"

end

print "\n"

Нужно ввести 2 строки - в первой должна содержаться строка, а во второй регулярное выражение, на соответствие которому и проверяется строка. После проверки строка выводится на экран, причем все ее совпавшие части печатаются в инверсном режиме. Не забивайте себе голову деталями сейчас, скоро будет произведен анализ этого кода.



str> foobar

pat> ^fo+

foobar

~~~

ТО, что выше наисано красным, на экране выглядит как инвертированное. "~~~~~" для тех, кто пользуется браузером в текстовом режиме.

Давайте попробуем другие сочетания.



str> abc012dbcd555

pat> \d

abc012dbcd555

~~~ ~~~

Если то, что выводит программа, для Вас является неожиданностью, то посмотрите внимательно на таблицу вверху этой страницы: \d не имееет никакого отношения к символу d, вместо этого он означает одиночную цифру.

А что, если имеется несколько способов удовлетворить условиям, накладываемым шаблоном?



str> foozboozer

pat> f.*z

foozboozer

~~~~~~~~

foozbooz дается как совпадение вместо fooz, поскольку регулярные выражения выделяют максимально длинную строку, удовлетворяющую шаблону.

Вот например, шаблон, позволяющий вычленить поле "время", внутри которого для разделения используются двоеточия.



str> Wed Feb 7 08:58:04 JST 1996

pat> [0-9]+:[0-9]+(:[0-9]+)?

Wed Feb 7 08:58:04 JST 1996

~~~~~~~~

"=~" это оператор выполнения сравнения по шаблону; он возвращает позицию в строке, начиная с которой найдено совпадение, или nil в случае, если таковое не найдено.



ruby> "abcdef" =~ /d/

3

ruby> "aaaaaa" =~ /d/

nil


Источник: www.opennet.ru
К началу статьи





Добавил: MadvEXДата публикации: 2007-10-06 10:59:26
Рейтинг статьи:3.12 [Голосов 8]Кол-во просмотров: 7163

Комментарии читателей

Всего комментариев: 2

2010-01-03 05:23:45
online
с празничком

2009-07-26 20:59:22
CidlyAliese
http://vjnkasjdmn.t35.com Супер сайт знакомств
Ваше имя: *
Текст записи: *
Имя:

Пароль:



Регистрация

Как вы относитесь к интернет-магазинам?
Не доверяю
18% (16)
Ни разу не пользовался и не буду
16% (15)
Пользовался единожды
12% (11)
Пользуюсь регулярно
26% (24)
Пользовался бы, но нет денег
18% (16)
А что такие бывают?
2% (2)
Обычные магазины лучше!
8% (7)

Проголосовало: 91
Клиент:
- В стоимость мультимедийного компьютера CDROM входит?
- Входит.
- Так там нет его!
- Kак нет?.. Я его Вам поставил.
- Ну, как, мы его открываем, а там пусто!..
Рейтинг: 5.8/10 (6)
Посмотреть все анекдоты