Evgenii Legotckoi
Evgenii Legotckoi21. Juni 2016 01:52

Benutzerhandbuch #05 - Ruby - Reguläre Ausdrücke

Lassen Sie uns ein interessanteres Programm schreiben. Diesmal prüfen wir, ob die Zeichenfolge mit der in der Kurzvorlage codierten Beschreibung übereinstimmt.

Bestimmte Zeichen und Zeichenkombinationen haben in diesen Mustern besondere Bedeutungen, darunter:

[] - definiert einen Bereich (z. B. bedeutet [az] Buchstaben im Bereich von a bis z
\w - Buchstabe oder Zahl, wie [0-9A-Za-z]
\W ist keine Zahl oder ein Buchstabe
\s - Leerzeichen wie [\t\n\r\f]
\S - keine Leerzeichen
\d - numerische Zeichen wie [0-9]
\D - keine Ziffernzeichen
\b - Backspace-Zeichen (0x08) (nur wenn im angegebenen Bereich)
\b - Ende des Wortes (außer im angegebenen Bereich)
\B - Wortgrenze
* - null oder mehr Wiederholungen des vorherigen Musters
+ - eine oder mehrere Wiederholungen des vorherigen Musters
{m, m} - mindestens m und keine Wiederholungen des vorherigen
? - mindestens eine Wiederholung des vorherigen
| - entweder der vorherige oder der nachfolgende Ausdruck kann übereinstimmen
() - Gruppierung


Der allgemeine Begriff für solche Muster ist * Reguläre Ausdrücke *. In Ruby wie in Perl werden sie meistens in Schrägstriche statt in doppelte Anführungszeichen eingeschlossen. Wenn Sie noch nie mit regulären Ausdrücken gearbeitet haben, kann es sinnvoll sein, einige Zeit damit zu verbringen, sie kennenzulernen. Sie haben eine Ausdruckskraft, die Ihnen Kopfschmerzen (und viele Zeilen unnötigen Codes) ersparen kann, wenn Sie Strings in einem Muster vergleichen, durchsuchen und bearbeiten müssen.

Angenommen, Sie möchten überprüfen, ob eine Zeichenfolge zu einer bestimmten Beschreibung passt: "Beginnt mit einem Kleinbuchstaben" f "gefolgt von einem Großbuchstaben und optional so lange wie möglich, bis ein Kleinbuchstabe angezeigt wird Wenn Sie ein erfahrener Benutzer sind C-Programmierer, Sie haben vielleicht schon Dutzende von Codezeilen in Ihrem Kopf geschrieben. Geben Sie es zu; Sie können sich selbst helfen. Aber in Ruby müssen Sie nur eine Abfrage gegen Ihren überprüften String mit dem folgenden regulären Ausdruck durchführen * / ^ f AZ * $ /. *

Was halten Sie davon, eine Hexadezimalzahl zu finden, die in dreieckige Klammern eingeschlossen ist? Kein Problem.

ruby> def chab(s)   # "contains hex in angle brackets"
    |    (s =~ /<0(x|X)(\d|[a-f]|[A-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

Während reguläre Ausdrücke auf den ersten Blick ziemlich kryptisch sein können, werden Sie schnell darauf zurückkommen.

Hier ist ein kleines Programm, das Ihnen hilft, mit regulären Ausdrücken zu experimentieren. Speichern Sie es in der Datei regx.rb und führen Sie " ruby regx.rb" in der Befehlszeile aus.

# Requires an ANSI terminal!

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"

Dieses Programm erfordert eine zweimalige Eingabe, das erste Mal eine Zeichenfolge und das zweite Mal einen regulären Ausdruck. Die Zeichenfolge wird durch den regulären Ausdruck validiert und dann mit hervorgehobenen Teilen gedruckt, die dem regulären Ausdruck entsprechen.

str> foobar
pat> ^fo+
foobar
~~~

Das passende Teil ist in der Auflistung mit der folgenden Zeile * "~~~" gekennzeichnet.*

Versuchen wir es mit weiteren Eingaben.

str> abc012dbcd555
pat> \d
abc012dbcd555
   ~~~    ~~~

Wenn Sie die Ausgabe des Programms überrascht, lesen Sie die Liste am Anfang des Artikels: * \ d * bezeichnet den Vergleich mit einer Ziffer.

Was ist, wenn es mehr als eine Möglichkeit gibt, Muster richtig zu vergleichen?

str> foozboozer
pat> f.*z
foozboozer
~~~~~~~~

foozbooz war eine vergleichbare Sequenz, statt nur fooz sind mit regulären Ausdrücken lange Teilstringvergleiche möglich.

Und hier ist ein Beispiel für das Finden einer Zeichenfolge im Laufe der Zeit.

str> Wed Feb  7 08:58:04 JST 1996
pat> [0-9]+:[0-9]+(:[0-9]+)?
Wed Feb  7 08:58:04 JST 1996
           ~~~~~~~~
  • "= ~" * ist der Vergleichsoperator für reguläre Ausdrücke. Es gibt die Position des gefundenen Strings zurück oder * nil *, wenn der String vom Muster des regulären Ausdrucks nicht gefunden wurde.
Рекомендуємо хостинг TIMEWEB
Рекомендуємо хостинг TIMEWEB
Stabiles Hosting des sozialen Netzwerks EVILEG. Wir empfehlen VDS-Hosting für Django-Projekte.

Magst du es? In sozialen Netzwerken teilen!

Kommentare

Nur autorisierte Benutzer können Kommentare posten.
Bitte Anmelden oder Registrieren
Letzte Kommentare
ИМ
Игорь Максимов5. Oktober 2024 07:51
Django – Lektion 064. So schreiben Sie eine Python-Markdown-Erweiterung Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
d
dblas55. Juli 2024 11:02
QML - Lektion 016. SQLite-Datenbank und das Arbeiten damit in QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
k
kmssr8. Februar 2024 18:43
Qt Linux - Lektion 001. Autorun Qt-Anwendung unter Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
Qt WinAPI - Lektion 007. Arbeiten mit ICMP-Ping in Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
EVA
EVA25. Dezember 2023 10:30
Boost - statisches Verknüpfen im CMake-Projekt unter Windows Ошибка LNK1104 часто возникает, когда компоновщик не может найти или открыть файл библиотеки. В вашем случае, это файл libboost_locale-vc142-mt-gd-x64-1_74.lib из библиотеки Boost для C+…
Jetzt im Forum diskutieren
J
JacobFib17. Oktober 2024 03:27
добавить qlineseries в функции Пользователь может получить любые разъяснения по интересующим вопросам, касающимся обработки его персональных данных, обратившись к Оператору с помощью электронной почты https://topdecorpro.ru…
JW
Jhon Wick1. Oktober 2024 15:52
Indian Food Restaurant In Columbus OH| Layla’s Kitchen Indian Restaurant If you're looking for a truly authentic https://www.laylaskitchenrestaurantohio.com/ , Layla’s Kitchen Indian Restaurant is your go-to destination. Located at 6152 Cleveland Ave, Colu…
КГ
Кирилл Гусарев27. September 2024 09:09
Не запускается программа на Qt: точка входа в процедуру не найдена в библиотеке DLL Написал программу на C++ Qt в Qt Creator, сбилдил Release с помощью MinGW 64-bit, бинарнику напихал dll-ки с помощью windeployqt.exe. При попытке запуска моей сбилженной программы выдаёт три оши…
F
Fynjy22. Juli 2024 04:15
при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …

Folgen Sie uns in sozialen Netzwerken