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

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

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

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

7.08.2008 16:48:42
Не забудьте прочитать Javadocs для java.util.regex.Pattern. Это хорошая ссылка. Также perldoc.perl.org/perlre.html
Adrian Pronk 17.09.2009 09:21:56
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("myaddress@domain.com")
name = match[1]
domain = match[2]

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

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

7
7.08.2008 17:02:10

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

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

0
25.08.2008 11:25:46

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

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

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

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

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

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

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

  1. regular-expressions.info
  2. Википедия - Регулярное выражение
7
7.08.2008 17:02:53
Это хорошее описание, но реальный пример Майка предпочтительнее, чем «2b». Было бы неплохо совместить два.
Bobby Jack 13.10.2008 10:19:46
squigglyскобки, касающиеся 2не так часто, они curly..
Timo 11.12.2017 08:03:10

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

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

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

http://www.regexbuddy.com/

0
7.08.2008 17:10:14

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

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

0
18.08.2008 23:54:10

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

2
19.08.2008 00:00:48

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

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

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

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

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

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

6
17.09.2009 08:56:35
Это умно, но вряд ли подходит для начинающего! :)
Bobby Jack 13.10.2008 10:23:50
@ Копас: Это абсолютно работает. Вы читали инструкции и объяснения, которые я связал?
Konrad Rudolph 17.09.2009 08:45:49

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

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

routineName \ (: а + \)

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

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

\#если. _DEBUG *

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

0
25.08.2008 12:46:46

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

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

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