[ОТВЕТИТЬ]
11.12.2014 13:01
OlegON
 
Регулярные выражения - неотъемлемая часть знаний системного администратора. Уже поднимались темы:
Немного о grep и регулярных выражениях
Регулярные выражения: выбираем знак дроби
Вот тут еще документация на русском:

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

Пишите вопросы и примеры. Для тех, кто силен в теме - первая задачка:
Задача с ютубом
Необходимо составить выражение на замену таким образом, чтобы при добавлении к строке ютуба #t=234 параметр преобразовывался в &start=234 и вставлялся в тег.
11.12.2014 13:49
OlegON
 
Запутал что ли? :)

ну, давайте попроще

часто надо принять строку не из шаблона, например: "Тел. код 495 и номер 123-4-5-6-7"
чтобы выкинуть из строки все, что не цифра, можно использовать шаблон "#[^0-9]#"
в строку замены надо вписать пробел, хотя на практике обычно оставляют пустую строку.
Объясню, из чего состоит шаблон: # - разделитель, в простом случае он ограничивает начало и конец шаблона. В [] определяем диапазон интересуемого, т.е. в нашем случае это цифры 0-9. Знак ^ обозначает "НЕ". Т.е. в переводе весь шаблон "НЕ цифры" заменяем на строку замены, т.е. пробел (или другой символ, если захотите).

Если нам нужно вытащить только код города, то это можно сделать следующим образом. Переведу "#.*код ([0-9]{3}) .*#":
.* - любое количество символов или их отсутствие, поясню, что, например, .+ - ненулевое количество любых символов. Точнее . - это любой символ, * - любое количество, + - ненулевое количество.
код - слово, как оно есть, с пробелом на конце
() - искомые данные, первые скобки (то, что внутри скобок) - это $1, вторые скобки - $2
[0-9] - цифра от нуля до девяти
{3} - впередиидущий символ повторяется три раза, т.е. [0-9]{3} - это любая трехзначная цифра
потом пробел и .*, что я описывал выше. Все вышеперечисленное заменяется на "code $1", т.е. слово code и то, что было в скобках.
11.12.2014 15:49
Micle
 
Для меня составление регулярок средней сложности всегда было из разряда шаманских плясок с бубном )) я конечно ещё раз вернусь к задачке, но с первого раза не получилось корректно разобрать. Нужно жеж учитывать что добавлено может быть не только #t=(\n+) после него могут быть "инородные включения", перед ним... Универсального варианта мне сходу получить не удалось. Буду ещё пробовать как выберу время.
11.12.2014 16:06
OlegON
 
\n - перевод строки, наверное, т.е. #t=([0-9]+), если уж на то пошло :) Попробуй начать с малого, решать задачки и задавать их другим :)
11.12.2014 16:16
Micle
 
да верно. имелось в виду \d
11.12.2014 18:12
Micle
 
Короче. Я наигрался )) не получается нифига. Не знаю как объяснить но в ряде случаев натыкался на то что поведение PCRE на сайте не соответствует описанию в документации. Что это? разность версий? Возможно. Но скорее всего это из за того что я использую не тот бубен. )))
11.12.2014 18:23
OlegON
 
Возможно. Я думал, что надо копать сюда. Но у меня тоже не получилось. Пока сделал двумя preg_replace, некрасиво и стыдно :(
12.12.2014 08:31
OlegON
 
Ну, давайте задачку попроще :)
Есть строка "Weather condition: -15C"
Задача - достать значение температуры.
12.12.2014 09:49
Micle
 
Цитата:
OlegON Ну, давайте задачку попроще :)
Есть строка "Weather condition: -15C"
Задача - достать значение температуры.

Вариант
12.12.2014 09:53
Micle
 
кривовато немного ))
12.12.2014 09:57
OlegON
 
Цитата:
Micle кривовато немного ))
Ошибка ;)
12.12.2014 09:59
Micle
 
вот тут знака вопроса не хватило
(-(\d+)

должно быть так
(-?(\d+)
12.12.2014 10:00
OlegON
 
Чтобы туда ссылки ставить, сначала пиши слово тут, потом выделяй его и жми глобус в панельке.
На самом деле, чем сложнее выражение, тем тяжелее (дольше для машины) его обрабатывать. Я, конечно, условие не додал, но просто бы выпилил все, кроме цифр и минуса...
12.12.2014 10:13
Micle
 
От постановки задачи зависит конечно )) в случае, если ещё и валидация какая-то нужна, то мой вариант ближе к правильному, нежели просто выдирание цифр
12.12.2014 10:58
OlegON
 
Ну, давай посложнее, тут заменить на пробел три цифры после b. Позиция плавающая.

А тут заменить на пробел символы между знаками вопроса включительно, т.е. должно получиться 12 22 54. Позиция плавающая. Читаем про жадные и нежадные регулярки ;)
12.12.2014 11:04
Micle
 
Цитата:
OlegON Ну, давай посложнее, тут заменить на пробел три цифры после b. Позиция плавающая.
вот
12.12.2014 11:12
OlegON
 
Цитата:
Micle вот
Не, ты оставляешь все, кроме заданного, а вырезать заданное можешь? ;)
12.12.2014 11:19
Micle
 
Цитата:
OlegON Не, ты оставляешь все, кроме заданного, а вырезать заданное можешь? ;)
ня
12.12.2014 11:22
Micle
 
Цитата:
OlegON А тут заменить на пробел символы между знаками вопроса включительно, т.е. должно получиться 12 22 54. Позиция плавающая. Читаем про жадные и нежадные регулярки ;)
вот так с учётом последних пожеланий


или так. Кому что. для меня первое более читабельно
12.12.2014 11:30
OlegON
 
Цитата:
Micle ня
Хреновый из меня учитель :) Я это имел ввиду
12.12.2014 11:34
Micle
 
Цитата:
OlegON Хреновый из меня учитель :) Я это имел ввиду
А толку то? задача выполнена ;)
12.12.2014 11:54
OlegON
 
Суть изучения - использование разных методик :)
12.12.2014 11:57
Micle
 
Цитата:
OlegON Суть изучения - использование разных методик :)
согласен. Но PCRE настолько гибок, что порой задача может решаться далеко не единственным способом.
12.12.2014 12:37
OlegON
 
Я и говорю - хреновый из меня учитель, что забыл про простой способ решения такой задачки.
19.12.2014 15:37
OlegON
 
Как одной строкой выкинуть из предложения знаки препинания и слова короче 4 букв и одновременно убрать пробелы, чтобы не получалось сдвоенных?
06.05.2015 09:16
OlegON
 
кто хочет поломать голову над этим проверка IP-адреса, чтобы проверять число до 255 в каждом октете?
Опции темы


Часовой пояс GMT +3, время: 08:29.

 

Форум сделан на основе vBulletin®
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd. Перевод: zCarot и OlegON
В случае заимствования информации гипертекстовая индексируемая ссылка на Форум обязательна.