Какие хорошие регулярные выражения? - PullRequest
10 голосов
/ 07 августа 2008

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

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

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

Ответы [ 9 ]

7 голосов
/ 07 августа 2008

Рассмотрим пример на 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("myaddress@domain.com")
name = match[1]
domain = match[2]

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

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

7 голосов
/ 07 августа 2008

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

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

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

Говорят, что он может читать "2 быть или не 2 быть".

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

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

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

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

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

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

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

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

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

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

2 голосов
/ 19 августа 2008

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

0 голосов
/ 17 сентября 2009

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

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

^(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])[a-zA-Z0-9]{5,10}$
0 голосов
/ 25 августа 2008

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

Поиск всех вхождений «рутины» с пропущенными параметрами по умолчанию:

routineName \ (: а + \)

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

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

\ # если. _DEBUG *

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

0 голосов
/ 19 августа 2008

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

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

0 голосов
/ 07 августа 2008

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

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

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

http://www.regexbuddy.com/

0 голосов
/ 07 августа 2008

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

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

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