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

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

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

PS извините за мой плохой английский

Ответов (9)

Решение

Рассмотрим пример на 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]

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

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

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

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

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

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

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

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

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

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

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

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

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

Регулярное выражение (regex или regexp для краткости) - это специальная текстовая строка для описания шаблона поиска. Вы можете думать о регулярных выражениях как о подстановочных знаках на стероидах. Вы, вероятно, знакомы с обозначениями с подстановочными знаками, такими как *.txtпоиск всех текстовых файлов в файловом менеджере. Эквивалент регулярного выражения .*\.txt$.

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

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

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

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

http://www.regexbuddy.com/

If you want to learn about regular expressions, I recommend Mastering Regular Expressions. It goes all the way from the very basic concepts, all the way up to talking about how different engines work underneath. The last 4 chapters also gives a dedicated chapter to each of PHP, .Net, Perl, and Java. I learned a lot from it, and still use it as a reference.

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

For instance, I might use a regex to find Oracle messages that are stuffed in log file. It isn't possible to know where the messages are--only what they look like. So a regex is the best solution to that problem. When you work with a relational database, the data is usually pre-structured, so a regex doesn't shine in that context.

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

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

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

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

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

Подробное и очень доступное объяснение есть в блоге Avinash Meetoo .

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

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

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

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

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

\#если. _ОТЛАЖИВАТЬ*

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