Что такое хорошие регулярные выражения?

Я проработал 5 лет в основном в настольных java-приложениях, обращающихся к базам данных Oracle, и никогда не использовал регулярные выражения. Сейчас я захожу в Stack Overflow и вижу много вопросов по ним; Я чувствую, что что-то упустил.

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

P.S. Извините за мой плохой английский

Не забудьте прочитать Javadocs для java.util.regex.Pattern. Это хорошая ссылка. Также perldoc.perl.org/perlre.html

Adrian Pronk 17.09.2009 13:21
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
11
1
3 013
9
Перейти к ответу Данный вопрос помечен как решенный

Ответы 9

A regular expression (regex or regexp for short) is a special text string for describing a search pattern. You can think of regular expressions as wildcards on steroids. You are probably familiar with wildcard notations such as *.txt to find all text files in a file manager. The regex equivalent is .*\.txt$.

Отличный ресурс по регулярным выражениям: http://www.regular-expressions.info

Регулярные выражения (или Regex) используются для сопоставления с образцом в строках. Таким образом, вы можете извлечь все адреса электронной почты из фрагмента текста, потому что он следует определенному шаблону.

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

/(bb|[^b]{2})/i

В разговоре это может читаться как «2 будет или 2 не будет».

Первая часть - скобки, они разделены трубкой | символ, который соответствует оператору или, поэтому (a | b) соответствует «a» или «b». Первая половина площади водопровода соответствует «bb». Название второй половины я не знаю, но это квадратные скобки, они соответствуют всему, что нет "b", поэтому там есть символ крыши (технический термин). Волнистые скобки соответствуют количеству вещей перед ними, в данном случае два символа, которые не являются «b».

После второго / стоит «i», что делает его нечувствительным к регистру. Использование начальной и конечной косой черты зависит от среды, иногда вы это делаете, а иногда нет.

Две ссылки, которые, я думаю, вам пригодятся:

  1. regular-expressions.info
  2. Википедия - Регулярное выражение

Это хорошее описание, но реальный пример Майка предпочтительнее каламбурного «2b». Было бы неплохо совместить два.

Bobby Jack 13.10.2008 14:19

Кронштейны squiggly относительно 2 встречаются нечасто, это curly ..

Timo 11.12.2017 11:03
Ответ принят как подходящий

Рассмотрим пример на Ruby:

puts "Matched!" unless /\d{3}-\d{4}/.match("555-1234").nil?
puts "Didn't match!" if /\d{3}-\d{4}/.match("Not phone number").nil?

"/ \ D {3} - \ d {4} /" - это регулярное выражение, и, как вы можете видеть, это ОЧЕНЬ лаконичный способ поиска совпадения в строке.

Кроме того, с помощью групп вы можете извлекать информацию как таковую:

match = /([^@]*)@(.*)/.match("[email protected]")
name = match[1]
domain = match[2]

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

Это лишь верхушка айсберга ... с помощью регулярного выражения можно делать много разных вещей, которые ДЕЙСТВИТЕЛЬНО упрощают обработку текста.

Если вы только начинаете работать с регулярными выражениями, я настоятельно рекомендую такой инструмент, как The Regex Coach:

http://www.weitz.de/regex-coach/

также слышал хорошие отзывы о RegexBuddy:

http://www.regexbuddy.com/

Как вы, возможно, знаете, в Oracle теперь есть регулярные выражения: http://www.oracle.com/technology/oramag/webcolumns/2003/techarticles/rischert_regexp_pt1.html. Я использовал новую функциональность в нескольких запросах, но она оказалась не такой полезной, как в других контекстах. Я считаю, что причина в том, что регулярные выражения лучше всего подходят для поиска структурированных данных, скрытых внутри неструктурированных данных.

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

Если вы хотите узнать о регулярных выражениях, я рекомендую Освоение регулярных выражений. Он идет от самых базовых концепций до разговоров о том, как работают разные движки. Последние 4 главы также посвящены каждому из PHP, .Net, Perl и Java. Я многому из него научился и до сих пор использую в качестве справочника.

Самое крутое регулярное выражение Когда-либо:

/^1?$|^(11+?)+$/

Он проверяет, является ли число простым. И это работает !!

Примечание: чтобы это работало, требуется небольшая настройка; число, которое мы хотим проверить, нужно сначала преобразовать в строку «1», тогда, мы можем применить выражение, чтобы проверить, содержит ли строка нет простое число «1»:

def is_prime(n)
  str = "1" * n
  return str !~ /^1?$|^(11+?)+$/ 
end

Подробное и очень доступное объяснение находится на Блог Авинаша Meetoo.

Умно, но новичку вряд ли подойдет! :)

Bobby Jack 13.10.2008 14:23

@Copas: Это абсолютно работает. Вы читали инструкции и объяснения, на которые я ссылался?

Konrad Rudolph 17.09.2009 12:45

Эти RE специфичны для Visual Studio и C++, но иногда я нахожу их полезными:

Найдите все вхождения «имя_программы» с параметрами, отличными от параметров по умолчанию:

имя_программы \ (: a + \)

И наоборот, чтобы найти все вхождения «имя_программы» только со значениями по умолчанию: имя_программы \ (\)

Чтобы найти код включенным (или отключенным) в отладочной сборке:

\#если._DEBUG *

Обратите внимание, что это перехватит все варианты: ifdef, если определено, ifndef, если! Определено

Проверка надежных паролей:

Это будет проверять пароль длиной от 5 до 10 буквенно-цифровых символов, по крайней мере, с одним верхним регистром, одним нижним регистром и одной цифрой:

^(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])[a-zA-Z0-9]{5,10}$

Другие вопросы по теме

Почему некоторые функции регулярных выражений возвращают объект соответствия, а некоторые нет?
Регулярное выражение для проверки того, содержит ли ввод две заданные строки, а часть между ними не содержит ни одного элемента из набора указанных строк
Regex: сопоставить кратчайший шаблон между двумя возможными разделителями
Использованиеdependent_wider_regex для создания новой строки для каждого совпадения в R
Добавить новые строки перед выбранными символами дефиса
Написание Regex для обработки дополнительных символов с плавающей запятой в начале строки?
Как извлечь из строки только уникальные значения, используя регулярное выражение в Python?
Регулярное выражение для соответствия таким символам, как ┼, ▓, ┐, ╔, ╠, ═, ╩, �
DotNet эквивалент Java Matcher.hitEnd()
Использование регулярного выражения для разделения подразделов с уникальными заголовками