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

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

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

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

Ответ 1

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

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

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

Ответ 2

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

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

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

Разговорный язык может читать "2 быть или не быть 2".

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

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

Две ссылки, которые, как мне кажется, вам удобны, это

Ответ 3

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

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

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

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

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

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

Ответ 4

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

Ответ 5

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

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

Ответ 6

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

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

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

http://www.regexbuddy.com/

Ответ 7

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

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

Ответ 8

Эти RE специфичны для Visual Studio и С++, но я нашел их полезными время от времени:

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

routineName\(: а + \)

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

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

\ # if._DEBUG *

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

Ответ 9

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

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

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