Я не получаю регулярные выражения - PullRequest
9 голосов
/ 26 февраля 2009

Я не понимаю и не вижу необходимости в регулярных выражениях.

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

Ответы [ 12 ]

30 голосов
/ 26 февраля 2009

Используйте их там, где вам нужно / манипулировать шаблонами . Например, предположим, что вам нужно распознать следующий шаблон:

  • Любая буква, A-Z, в верхнем или нижнем регистре, 5 или 6 раз
  • 3 цифры
  • одна буква a-z (определенно строчная)

(Подобные вещи встречаются для почтового индекса, кредитной карты, проверки номера социального страхования и т. Д.)

Это не совсем сложно писать в коде - но это становится сложнее по мере усложнения шаблона. С помощью регулярного выражения вы описываете шаблон (а не код для его проверки) и позволяете обработчику регулярных выражений выполнять всю работу за вас.

Шаблон здесь будет выглядеть примерно так:

[A-Za-z]{5,6}[0-9]{3}[a-z]

(Есть и другие способы выразить это.) Группирующие конструкции облегчают сопоставление целого шаблона и получение (или замену) его различных битов.

Несколько недостатков:

  • Регулярные выражения могут стать сложными и их трудно читать довольно быстро. Документ тщательно!
  • Существуют различия в поведении между различными двигателями регулярных выражений
  • Сложность может быть трудно судить, если вы не эксперт (а я, конечно, нет!); есть «ошибки», которые могут замедлить работу паттернов по отношению к конкретному вводу, и эти ошибки не совсем очевидны
  • Некоторые люди чрезмерно злоупотребляют регулярными выражениями (а некоторые, конечно, недооценивают их). Худший пример, который я видел, был, когда кто-то спросил (в группе C #), как проверить, была ли строка длиной 3 - это явно работа для использования String.Length, но кто-то серьезно предложил сопоставить регулярное выражение. Безумие. (Они также неправильно поняли регулярное выражение, что как бы доказывает это.)
  • Регулярные выражения используют обратную косую черту, чтобы избежать различных вещей (например, использовать. Для обозначения «точка», а не просто «любой символ». Во многих языках саму обратную косую черту необходимо экранировать.
23 голосов
/ 26 февраля 2009

Для чего используются регулярные выражения:

Регулярные выражения - это сам по себе язык, который позволяет выполнять сложную проверку строковых входных данных. То есть Вы передаете ему строку, и она возвращает true или false, если это совпадение или нет.

Как используются регулярные выражения:

  • Проверка формы, определите, соответствует ли введенный пользователем формат, который вы хотите
  • Нахождение позиции определенного шаблона в блоке текста
  • Поиск и замена, где поисковый термин является регулярным выражением, а то, что заменить, является обычной строкой.

Некоторые особенности языка регулярных выражений:

  • Чередование: позволяет выбрать ту или иную вещь. Пример совпадения только да или нет.

    да | нет

  • Группировка: Вы можете определить область действия и иметь приоритет, используя скобки. Например, сопоставьте 3 цветовых оттенка.

    г (а | е) у | черный | белый

  • Количественная оценка: Вы можете определить, сколько чего-то вы хотите. ? означает 1 или 0, * означает 0 или более. + означает хотя бы один. Пример: принять двоичную строку, которая не является пустой:

    (0 | 1) +

Почему регулярные выражения?

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

Не для всех типов соответствия:

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

Доступно практически на всех языках:

Регулярные выражения доступны практически на любом языке программирования.

Официальный язык:

Любое регулярное выражение может быть преобразовано в детерминированный конечный автомат. И таким же образом вы можете понять, как создать исходный код, который будет проверять ваше регулярное выражение.

Пример:

[hc]+at 

соответствует "hat", "cat", "hhat", "chat", "hcat", "ccchat" и т. Д., Но не "at"

Источник, дальнейшее чтение

4 голосов
/ 26 февраля 2009

Они выглядят немного загадочно, но они предоставляют очень мощный инструмент для поиска шаблонов в тексте . Что-нибудь от href тегов на HTML-страницах до проверки адресов электронной почты.

И они могут быть преобразованы в очень эффективную структуру данных (FSA), которая очень быстро находит совпадения.

3 голосов
/ 26 февраля 2009

Если бы я мог направить ФП к некоторым ответам / комментариям на один из моих собственных вопросов: Насколько важно знание регулярных выражений?

3 голосов
/ 26 февраля 2009

Они немного хитрые, но чрезвычайно мощные и заслуживают изучения. Сеть полна учебников и примеров, начните, например, с здесь и посмотрите на примеры здесь .

1 голос
/ 26 февраля 2009

Пример электронной почты на самом деле является плохим примером для регулярных выражений. Можно использовать регулярные выражения, но результирующее выражение (например, это , которое не обрабатывает адреса в стиле «Джон Доу») чрезвычайно сложно - взгляните на спецификацию адреса электронной почты и вы поймете, почему ...

Однако регулярные выражения очень полезны в целом ряде других ситуаций, когда извлекаются ip-адреса из текста, теги из html и т. Д. Еще одним примером может быть поиск всех версионных файлов. Что-то вроде:

my_versioned_file_(\d{4}-\d{2}-\d{2}).txt

будет соответствовать любым именам файлов в формате my_versioned_file_2009-02-26.txt и извлечет дату в виде захваченной группы (часть, заключенная в "()") для дальнейшего анализа.

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

1 голос
/ 26 февраля 2009

Регулярные выражения - это очень краткий способ указать большинство проблем с сопоставлением с образцом и заменой, и механизмы регулярных выражений могут быть очень высоко оптимизированы.

Если вы хотите выполнить ту же работу, что и сравнительно простое регулярное выражение, вам придется написать много кода, который, вероятно, будет содержать множество ошибок, будет трудным для понимания и плохой работы.

Принимая во внимание, что делать то же самое с регулярным выражением намного короче, почти наверняка работает так же хорошо, как это технически возможно, и его легче понять любому, кто знаком с регулярными выражениями (хотя это следует прокомментировать в любом случае)

0 голосов
/ 21 октября 2009

Пример критического использования: JavaScript :
Если вам нужно сделать search или replace для строки, единственное соответствие, которое вы можете сделать, это регулярное выражение. Это в JavaScript API для этих строковых методов ...

Лично я в основном использую регулярные выражения только тогда, когда мне нужно некоторое расширенное сопоставление в автоматическом поиске / замене в текстовом редакторе ( TextPad или Visual Studio). Самая мощная функция на мой взгляд - это возможность сопоставить шаблон, который можно вставить в замену.

0 голосов
/ 28 февраля 2009

Некоторые практические применения в реальном мире:

Поиск абстрактных классов, расширяющих TestCase JUnit:

abstract\s+class\s+\w+\s+extends\s+TestCase

Это полезно для поиска тестовых случаев, которые не могут быть созданы, и их необходимо исключить из сценария сборки ant, который выполняет тестовые случаи. Вы не можете искать обычный текст, потому что вы не знаете названия классов заранее. следовательно \ w + (хотя бы один символ слова).

Поиск сценариев оболочки bash или bourne:

 ps -e | grep -e " sh| bash"

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

Это не идеально, но большинство регулярных выражений не будут, или они будут так долго писать, что они того не стоят. Те, которые вы совершенствуете, - это те, которые вы совершаете как часть своего рода валидации или встроенного приложения.

0 голосов
/ 26 февраля 2009

Джон и Sqook дали точное объяснение и определение регулярных выражений, и для простых задач это довольно понятно, но если вы используете его для сложных задач, регулярные выражения могут быть & $ @ (( хотя бы для меня; -))

Я часто использую Expresso, чтобы помочь мне создать сложный код регулярного выражения.

http://www.ultrapico.com/Expresso.htm

Он имеет встроенную библиотеку с выражениями, которые вы можете использовать, режим разработки, в котором вы можете создать свой код, и режим тестирования, в котором вы можете тестировать и проверять код. Это помогло мне лучше понять и понять сложные выражения!

Гудлак!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...