Я не получаю регулярных выражений

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

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

Ответов (12)

Решение

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

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

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

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

Здесь шаблон будет примерно таким:

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

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

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

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

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

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

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

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

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

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

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

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

    да | нет

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

    gr (a | e) y | черный | белый

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

    (0 | 1) +

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

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

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

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

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

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

Формальный язык:

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

Пример:

[hc]+at 

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

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

Чтобы дать вам несколько примеров:

  • Адрес электронной почты

  • Пароль требует минимум 1 буквы и 1 цифры

  • Как выполнить эти требования?

  • Лучше всего использовать регулярное выражение.

Прочтите следующие ссылки, чтобы узнать больше:

Как: использовать регулярные выражения для ограничения ввода в ASP.NET http://msdn.microsoft.com/en-us/library/ms998267.aspx

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

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

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

Например адрес электронной почты ...

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

Regex r = new Regex("<An Email Address Regex>");
bool isValidEmail = r.IsMatch(MyInput);

Другими примерами могут быть проверки правильности формата чисел перед их преобразованием в целые числа и т. Д.

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

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

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

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

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

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

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

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

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

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

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

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

Удачи!

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

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

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

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

Поиск запущенных сценариев оболочки bash или bourne:

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

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

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

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

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