Регулярные выражения на все случаи жизни

CSS

Client
Регистрация
22.05.2010
Сообщения
1 327
Реакции
665
Баллы
113
Собираем народный список регулярок (regex) на все случаи жизни, начну первым. У кого есть свои - закидывайте, добавлю в первый пост указав автора. Регулярки бывает могут работать не правильно, если что отписывайтесь в этой теме - найдём решение.

[TABLE="class: brtb_item_table, border-width: 4px"][TBODY][TR][TH]Список регулярных выражений и типовых контекстов использования[/TH][/TR]
[TR][TD]Поиск числа больше 0
Код:
Развернуть Свернуть Копировать
(?<=(\D|^))[1-9]\d*

Вариант использования:
regex_width.png


в этом примере ищутся строго видимые элементы, невидимые же (имеющие ширину 0px) игнорируются, но иногда бывают осечки - когда сайт слоями накладывает элементы (встречается например в гугле).

Благодарим: CSS, ZennoScript[/TD][/TR]
[TR][TD] Разбор текста на предложения, кажется автора ZennoScript, немного мной доработано
Код:
Развернуть Свернуть Копировать
[А-ЯA-Z].{15,}?(\.|\!|\?)(?=\ |\r|\n|$)

пример работы, на входе:
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce dapibus tellus nec nulla gravida, sed congue nunc hendrerit. Integer interdum elementum lorem id rutrum. Ut sit amet interdum mauris. Phasellus mollis ex eleifend lacus molestie dictum. Fusce blandit, ligula non condimentum maximus, massa nisi ullamcorper odio, et vehicula nisl nunc nec orci. Sed neque diam, gravida eu blandit ullamcorper, porttitor non lorem. Etiam sagittis diam a dolor feugiat placerat. Suspendisse enim turpis, imperdiet in tellus sit amet, consectetur porta magna. Suspendisse odio nulla, imperdiet eget augue in, pulvinar hendrerit nunc. Aenean ut cursus tellus, nec vehicula ante. Vestibulum ornare erat non ante tempus, eu aliquet felis dapibus. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Mauris eget arcu imperdiet, laoreet erat non, imperdiet leo. Sed arcu mi, ornare non leo sed, faucibus semper nunc.
на выходе:
sent.png


Благодарим: ZennoScript[/TD][/TR]
[TR][TD]Поиск слова начинающегося с определённого текста (благодарим ZennoScript за доработку)
Код:
Развернуть Свернуть Копировать
(?i)\bgo.*?(?=\W|\ |\r|\n|$)
найдёт в тексте все слова начинающиеся на go, например: goal, god, google

Благодарим: CSS, ZennoScript[/TD][/TR]
[TR][TD]Ищет число в диапазоне 400-699:
Код:
Развернуть Свернуть Копировать
^([4-6][0-9][0-9])$
подробнее про диапазоне можно посмотреть здесь http://www.regular-expressions.info/numericranges.html

Поделился: CSS[/TD][/TR]
[TR][TD]Виртуальные колонки с разделителем ";"
Код:
Развернуть Свернуть Копировать
(?<=(^|;)).*?(?=(;|$|\r\n))
на входе: name;pass;mail
на выходе: нужная вам "колонка" по номеру совпадения:
col.png

вариант использования: работаем со списком, разбираем по кускам колонки как в таблице

Поделился: CSS[/TD][/TR]
[TR][TD]Получить имя файла из пути windows:
Код:
Развернуть Свернуть Копировать
([^\\]+$)
на входе:
С:\Program Files (x86)\ZennoLab\ZennoPoster Pro\Progs\ZennoPoster.exe
на выходе: ZennoPoster.exe

Поделился: CSS[/TD][/TR]
[TR][TD]Поиск строк НЕ содержащих указанную (под)строку:
Код:
Развернуть Свернуть Копировать
(?<=(^|\r\n))((?!(test)).)*(?=($|\r\n))
на входе:
на выходе:

Поделился: CSS[/TD][/TR]
[TR][TD]Взять все строки больше 18 символов
Код:
Развернуть Свернуть Копировать
(?<=(\r\n|^)).{18,}(?=(\r\n|$))

Благодарим: alekwuy[/TD][/TR]
[TR][TD]Взять все строки до 18 символов
Код:
Развернуть Свернуть Копировать
(?<=(\r\n|^)).{1,18}(?=(\r\n|$))

Благодарим: alekwuy[/TD][/TR]
[TR][TD]Поиск всех HTML тегов
Код:
Развернуть Свернуть Копировать
<.*?>
Вариант использования - очистка текста от HTML кода

Благодарим: Trader1985[/TD][/TR]
[TR][TD]Поиск всех пустых строк в тексте
Код:
Развернуть Свернуть Копировать
\n\r
Вариант использования - приведение текста в порядок

Благодарим: Trader1985[/TD][/TR]
[TR][TD]Поиск от трёх и более пустых строк
Код:
Развернуть Свернуть Копировать
(?<=(\r\n){2})(\r\n){1,}
Вариант использования - приведение текста в порядок в случае когда нас устраивает 2 пустые строки

Благодарим: Trader1985[/TD][/TR]
[TR][TD]Email:
Код:
Развернуть Свернуть Копировать
[\.\-_A-Za-z0-9]+?@[\.\-A-Za-z0-9]+?[\.A-Za-z0-9]{2,}
[/TD][/TR]
[TR][TD]IP
Код:
Развернуть Свернуть Копировать
(\d{1,3}\.){3}\d{1,3}
[/TD][/TR]
[TR][TD]URL
Код:
Развернуть Свернуть Копировать
(http|ftp|https):\/\/[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&amp;:/~\+#]*[\w\-\@?^=%&amp;/~\+#])?
[/TD][/TR]
[TR][TD] IP:PORT (например для парсинга прокси)
Код:
Развернуть Свернуть Копировать
(\d{1,3}\.){3}\d{1,3}:\d*
Благодарим: up_lvl[/TD][/TR][/TBODY][/TABLE]
 
Категория
  1. Полезно
Последнее редактирование модератором:
(?<=(\r\n|^)).{18,}(?=(\r\n|$)) такая регулярка возьмет все строки, в которых больше 18 символов, а такая где до 18 включительно:
(?<=(\r\n|^)).{0,18}(?=(\r\n|$))

точно не помню где взял)
 
точно не помню где взял)
Добавлено!

Если вдруг у кого криво работает регулярка - в этой теме напишите, придумаем решение. Очень часто регулярки могут спотыкаться когда к примеру текст идёт в одну строку без переносов строк.
 
  • Спасибо
Реакции: alekwuy
  1. ^[1-9][0-9]*$ Это можно заменить просто на [1-9]\d*, тогда не будет никаких осечек.
  2. (?i)go.*?(?=\ |\r|\n|$) - это меняем на (?i)\bgo.*?(?=\W|\ |\r|\n|$) Так будет более правильно.
  3. http://ZennoScript.com/ru/tutorial/tutorials/regex - видеоролик Вам в помощь!
 
Последнее редактирование:
  1. ^[1-9][0-9]*$ Это можно заменить просто на [1-9]\d*, тогда не будет никаких осечек.
  2. (?i)go.*?(?=\ |\r|\n|$) - это меняем на (?i)\bgo.*?(?=\W|\ |\r|\n|$) Так будет более правильно.
  3. http://ZennoScript.com/ru/tutorial/tutorials/regex - видеоролик Вам в помощь!
1. По осечкам - обновил информацию в первом посте. Не нравится ни этот код, ни тот что в первом посте, этот не нравится тем что находит при 010 => 10, а тот что в первом посте тем что после упрощения начинает точно также работать
2. Очень хорошая реализация, добавлена в первый пост
3. Ссылки пока что не определил куда складировать, подумаем
 
Последнее редактирование модератором:
Вот, есть для текста, спрашивал когда-то у местных гуру:

<.*?> – поиск всех html тегов, например, чтобы спарсенный текст очистить от кода.
\n\r - поиск всех пустых строк
(?<=(\r\n){2})(\r\n){1,} – поиск от трёх и более пустых строк. Подойдёт для создания более "красивого" текста - убирает лишние пустые строки
 
  • Спасибо
Реакции: vadim4ukr, Greez и CSS
XML тэг
За открывающей скобкой < должно стоять слово из букв — имя элемента, затем могут быть атрибуты — любые символы, кроме закрывающей скобки >. Далее — любой текст (содержимое) и закрывающий тэг, т.е. <имя />, или как минимум один пробел, слэш и закрывающаю скобка (самозакрывающийся тэг).

Паттерн:/^<([a-z]+)([^>]+)*(?:>(.*)<\/\1>|\s+\/>)$/
 
  • Спасибо
Реакции: CSS
XML тэг
За открывающей скобкой < должно стоять слово из букв — имя элемента, затем могут быть атрибуты — любые символы, кроме закрывающей скобки >. Далее — любой текст (содержимое) и закрывающий тэг, т.е. <имя />, или как минимум один пробел, слэш и закрывающаю скобка (самозакрывающийся тэг).

Паттерн:/^<([a-z]+)([^>]+)*(?:>(.*)<\/\1>|\s+\/>)$/
notepad++ вместе со встроенным regex тестером глубоко задумались, так глубоко что мне не удалось дождаться завершения на небольшом тестовом html коде
 
Вот, есть для текста, спрашивал когда-то у местных гуру:

<.*?> – поиск всех html тегов, например, чтобы спарсенный текст очистить от кода.
\n\r - поиск всех пустых строк
(?<=(\r\n){2})(\r\n){1,} – поиск от трёх и более пустых строк. Подойдёт для создания более "красивого" текста - убирает лишние пустые строки
Благодарю! Добавлено в первый пост
 
подскажите регулярку.
Нужно с строки удалить первые 6 символов.
Символы маленькие английские буквы
 
1. По осечкам - обновил информацию в первом посте. Не нравится ни этот код, ни тот что в первом посте, этот не нравится тем что находит при 010 => 10, а тот что в первом посте тем что после упрощения начинает точно также работать

Не видел, чтобы встречались значения ширины или высоты вида 010, это можно обойти добавив символ ^[1-9]\d* или же вообще указать просто [^0] т.е. это будет означать, что число не начинается с нуля.
По поводу наслаивающихся элементов - тут этим просто так не решить, для этого нужно искать необходимые атрибуты для поиска. Их всегда можно правильно подобрать, нужно только внимательно посмотреть на коды элементов, так же это можно регулировать номерами совпадения, т.е. устанавливать, чтобы заполнялся последний элемент, он как правило находится сверху.
 
Не видел, чтобы встречались значения ширины или высоты вида 010, это можно обойти добавив символ ^[1-9]\d* или же вообще указать просто [^0] т.е. это будет означать, что число не начинается с нуля.
Ширина и высота это просто пример использования регулярки, сама регулярка подразумевает поиск числа, а не последовательности цифр, однако ищет именно последовательность цифр начинающуюся не с нуля.

Можете попробовать написать регулярку которая на входе пример:
Код:
Развернуть Свернуть Копировать
0
001
100
200
и на выходе выдаст:
Код:
Развернуть Свернуть Копировать
100
200
В таком случае она будет выполнять заявленную задачу, и можно будет её обновить в первом посте.

По поводу наслаивающихся элементов - тут этим просто так не решить, для этого нужно искать необходимые атрибуты для поиска. Их всегда можно правильно подобрать, нужно только внимательно посмотреть на коды элементов, так же это можно регулировать номерами совпадения, т.е. устанавливать, чтобы заполнялся последний элемент, он как правило находится сверху.
Решение всему есть, и мне это известно также как и вам. Данная информация об осечке служит лишь целью предупредить людей чтобы они знали её ограничения.
 
Последнее редактирование модератором:
Ширина и высота это просто пример использования регулярки, сама регулярка подразумевает поиск числа, а не последовательности цифр, однако ищет именно последовательность цифр начинающуюся не с нуля.

Можете попробовать написать регулярку которая на входе пример:
Код:
Развернуть Свернуть Копировать
0
001
100
200
и на выходе выдаст:
Код:
Развернуть Свернуть Копировать
100
200
В таком случае она будет выполнять заявленную задачу, и можно будет её обновить в первом посте.


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

Например так (?<=(\D|^))[1-9]\d*
Опять же - эти вещи можно крутить как угодно, главное понимать что именно нужно.
 
  • Спасибо
Реакции: CSS
А как сделать такую регулярку? Например, есть строки которые начинаются из символов а после них идет http - 353http://. Просто взять это мелочь, а вот как брать сначала те строки в которых число поменьше (отсортировать в числовом диапазоне). Например, первое совпадение 100http:// должно иметь приоритет выше чем 353http://, и так со всеми строками по порядку. Можно от 100 до 5000, а можно от 0 без разницы :-)
 
Последнее редактирование:
А как сделать такую регулярку? Например, есть строки которые начинаются из символов а после них идет http - 353http://. Просто взять это мелочь, а вот как брать сначала те строки в которых число поменьше (отсортировать в числовом диапазоне). Например, первое совпадение 100http:// должно иметь приоритет выше чем 353http://, и так со всеми строками по порядку. Можно от 100 до 5000, а можно от 0 без разницы :-)
Выложи что на входе, и что нужно получить на выходе, сейчас задача не совсем понятна, похоже что тут смешана задача с парсингом (regex) и с сортировкой (C#)
 
А как сделать такую регулярку? Например, есть строки которые начинаются из символов а после них идет http - 353http://. Просто взять это мелочь, а вот как брать сначала те строки в которых число поменьше (отсортировать в числовом диапазоне). Например, первое совпадение 100http:// должно иметь приоритет выше чем 353http://, и так со всеми строками по порядку. Можно от 100 до 5000, а можно от 0 без разницы :-)

Просто получаете все значения в список и после этого сортируете строки в списке по возрастанию.
 
сортируете строки в списке по возрастанию.
Вчера так и сделал, но потом дошло что можно сделать на C# Regex после чего отсортировать и всё это в одном флаконе..
Выложи что на входе, и что нужно получить
Примерно то что сказал ZennoScript, но вы правы, все это можно спарсить и сразу отсортировать в одном экшине. Эх, не дошло сразу :dy:Сори за флуд)
 
Последнее редактирование модератором:
  • Спасибо
Реакции: IndaLab
Доброго дня, только начинаю разбираться с зеннопостером. Вопрос по регулярным выражениям. Собраю через DOM нужное значение и кладу его в переменную. Но в таблицу из переменной это значение не уходит, предполагаяю из-за того что в переменной, значение получается с пробелами перед самим значением. Как доработать регулярное выражение, чтобы очистить получаемые данные от пробелов. Значение 1,2 и более слов, плюс даты попадаются. Выражение выглядит вот так (?<=\ Город:&nbsp;</div>)[\w\W]*?(?=</div>). Данные приходят такие \\\\\\\\\Петропавловск Камчатский\\\
 
Добавляйте в список, поток в цикле из списка берите построчно и к каждому значению применяйте Операции с текстом- Trim перед сохранением в другом месте
 
Добавляйте в список, поток в цикле из списка берите построчно и к каждому значению применяйте Операции с текстом- Trim перед сохранением в другом месте
Спасибо, попмогло, только я не стал список подключать, применяю этот экшен к переменной и в нее же записываю данные.
 
Друзья, подскажите, пожалуйста каким образом из этой конструкции можно вытянуть только текст, заключённый в тег <a>?
В данном случае нужно "Keep Watch Beanie (Black/Green)"

<h2 class="field field-name-title-field field-type-text field-label-hidden">
<a href="/clothing/keep-watch-beanie-blackgreen">Keep Watch Beanie (Black/Green)</a> </h2>

+ в Карму всем откликнувшимся!)
 
Друзья, подскажите, пожалуйста каким образом из этой конструкции можно вытянуть только текст, заключённый в тег <a>?
В данном случае нужно "Keep Watch Beanie (Black/Green)"

<h2 class="field field-name-title-field field-type-text field-label-hidden">
<a href="/clothing/keep-watch-beanie-blackgreen">Keep Watch Beanie (Black/Green)</a> </h2>

+ в Карму всем откликнувшимся!)
с помощью экшена Обработка текста - Замена, в режиме Regex: <[^>]*> заменить на пустоту..
 
Друзья, подскажите, пожалуйста каким образом из этой конструкции можно вытянуть только текст, заключённый в тег <a>?
В данном случае нужно "Keep Watch Beanie (Black/Green)"

<h2 class="field field-name-title-field field-type-text field-label-hidden">
<a href="/clothing/keep-watch-beanie-blackgreen">Keep Watch Beanie (Black/Green)</a> </h2>

+ в Карму всем откликнувшимся!)
(?<=<a.*>)[\w\W]*?(?=</a>)
Можно такой регуляркой
 
ребята подскажите с регуляркой нужен пробел. задача экшен обработка текста в переменной состоящей из нескольких- слов пример_такой_пример , с помощью замены регексом заменить нижнее подчеркивание на пробел. пробовал менять так \s в текст пишется \
при выставлении просто пробела с клавиатуры, экшен работает правильно только до перезагрузки программы. при следующем запуске проэкта поле замены пробелом заменяется на пустоту,
 
Попробуйте пробел в переменную положить и её прописать в замене
 
ребята подскажите с регуляркой нужен пробел. задача экшен обработка текста в переменной состоящей из нескольких- слов пример_такой_пример , с помощью замены регексом заменить нижнее подчеркивание на пробел. пробовал менять так \s в текст пишется \
при выставлении просто пробела с клавиатуры, экшен работает правильно только до перезагрузки программы. при следующем запуске проэкта поле замены пробелом заменяется на пустоту,
Не пробовали вместо пробела писать макрос {-String.Space-}? По-моему в Вашем случаем самое то.
 
  • Спасибо
Реакции: gnomza75 и CSS
Друзья помогите, забираю текст через DOM, сразу в список. Но Первое слово в нужном мне абзаце выделено жирным, соответственно текст я получаю такого вида - текст </strong> текст текст. Как изменить регулярное выражение, чтобы при парсинге страницы убрать этот тег. Регулярка выглядит так (?<=<div\ class="text"><strong>)[\w\W]*?(?=</div>). В нужном тексте нужны по идее только цифры и кирилица.
 

Кто просматривает тему: (Всего: 0, Пользователи: 0, Гости: 0)