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

StackOverflow https://stackoverflow.com/questions/4954

  •  08-06-2019
  •  | 
  •  

Вопрос

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

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

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

Это было полезно?

Решение

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

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

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

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

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

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

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

В устной речи это может звучать как "2 быть или не 2 быть".

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

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

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

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

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

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

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

Н.Б.:чтобы это заработало, необходима небольшая настройка;число, которое мы хотим протестировать, должно быть преобразовано в строку типа “1”это первый, тогда мы можем применить это выражение, чтобы проверить, соответствует ли строка нет содержат простое число “1”с:

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

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

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

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

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

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

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

Найдите все вхождения "routineName" с переданными параметрами, отличными от стандартных:

Имя процедуры\(:a+\)

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

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

\#если._ДЕБУГ*

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

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

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

^(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])[a-zA-Z0-9]{5,10}$
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top