Вы когда-нибудь запутались в использовании регулярных выражений?
Что это? Это мощно? Стоит ли тратить время на его изучение?
Сегодня я кратко расскажу о регулярных выражениях, а также проиллюстрирую некоторые примеры с использованием языка PHP.
Мотивация:
Я всегда борюсь с регулярным выражением, так как я был студентом. Мне действительно не нравится сложность шаблона регулярного выражения. Однако, начав разрабатывать больше программ, я понимаю, что это очень мощный инструмент, который должен изучить каждый программист. Вы можете применить его к различным сценариям, таким как манипуляции со строками, фильтрация слов и так далее.
Недавно я подал заявку на бэкэнд-разработчика в компанию в Таиланде. Они требуют, чтобы я сдал их задачи по программированию. Одна из проблем заключается в использовании PHP для определения конечного местоположения бота из заданных инструкций в виде строкового шаблона.
For example, given a following string “W-17WW111WBR-20RRLL2RLBB-88BBB3B9BWR1111L-30L15R7" where W means to walk forward, B means to walk backward, R means to turn right from the current direction for 90 degree and L means to turn left from the current direction for 90 degree. The following numbers after each character identify the measurement of each instruction such as W111 means a bot walks forward for 111 units. B20 means a bot walks back for 20 units. R7 means a bot will turn right 7 times. L2 means a bot will turn left for 2 times. If the following numbers after each character is a negative value, it is considered as 1 unit. For example, W-17 = W1 or W. The initial location of the bot is x=0, y=0, and face to the north direction.
Нет сомнений в том, что я должен использовать какой-то метод для решения этой конкретной проблемы путем поиска шаблона одного символа, за которым следует цифра (а) или символ (ы). Какой подход я должен использовать для решения этой проблемы?
Регулярное выражение:
- Регулярное выражение - это особый шаблон строки, который используется для поиска текста. В основном он используется для поиска определенного шаблона, такого как имя человека, теги HTML, определенная комбинация текста, числа и символа и т. Д.
Сопоставление с шаблоном:
- Прежде чем мы перейдем к упражнению, вам нужно знать базовый паттерн регулярного выражения.
- Шпаргалка по регулярным выражениям !!
(Ссылка: http://clevertechie.com/files/regex-cheat-sheet.png)
В этой шпаргалке вы найдете основные подстановочные знаки, которые используются в регулярных выражениях. Выражение.
ПРИМЕЧАНИЕ. Следующие ниже примеры тестируются на интерактивном веб-сайте регулярных выражений https://regex101.com/.
Вы также можете проверить свой результат на этом веб-сайте.
Примеры базовых шаблонов:
- Заданная строка: «W-17WW111WBR-20RRLL2RLBB-88BBB3B9BWR1111L-30L15R7».
Пример шаблона регулярного выражения:
- R \ d {0,}
Соответствует любой строке, содержащей R, за которой следует 0 или более цифр.
Вывод: R, R, R, R, R1111, R7
- \ d {1}
Соответствует ровно 1 цифре.
Вывод: 1,7,1,1,1,2,0,2,8,8,3,9,1,1,1, 1,3,0,1,5,7
- \ d {1,3}
Соответствует от 1 до 3 цифр.
Вывод: 17,111,20,2,88,3,9,111,1,30,15,7
- \ w {1}
Соответствует ровно 1 символу.
Вывод: W, 1,7, W, W, 1,1,1, W, B, R, 2,0, R, R, L, L, 2, R, L, B, B, 8,8, B, B, B, 3, B, 9, B, W, R, 1,1,1,1, L, 3,0, Л, 1,5, П, 7
- \ w {3,5}
Соответствует от 3 до 5 символов. Символ может быть буквой или цифрой.
Вывод: 17WW1, 11WBR, 20RRL, L2RLB, 88BBB, 3B9BW, R1111, 30L15
- \ D
Соответствует НЕ-цифровому символу.
Вывод: W, -, W, W, W, B, R, -, R, R, L, L, R, L, B, B, -, B, B, B, B, B, W, R, L, -, L, R
- \ W
Соответствует НЕ-словному символу.
Вывод: -, -, -, -
- [a-zA-Z] {3}
Соответствует 3 последовательных символа между a-z или A-Z.
Вывод: WBR, RRL, RLB, BBB, BWR.
Примечание. В PHP вы должны включать '/' до и после вашего шаблона, например R \ d {1,} - ›/ R \ d {1,} /. Интерактивный веб-сайт, который я использовал в этом примере, по умолчанию включал «/ /».
Как использовать это в PHP:
Если вы хотите найти конкретное имя человека в предложении, например, найти имя человека, начинающееся с буквы S, в следующем предложении
«Я - Лето. Все звали меня Саммер.
Сьюзан - моя девушка, она живет в Саннивейле ».
Есть несколько встроенных функций PHP, которые мы можем использовать.
- preg_match ($ pattern, $ str, $ array)
Это встроенная функция поиска определенного шаблона.
Где
$pattern = The pattern that we want to find from an input string. $str = The input string. $array = The output array that store a match word.
Эта функция вернет 1, если образец найден. В противном случае он вернет 0. Как только он найдет первое совпадение, он сохранит только первое совпадение в объекте $ array.
2. preg_match_all ($ шаблон, $ str, $ массив)
Разница между этой функцией и preg_match () в том, что она сохраняет все совпадающие слова внутри объекта $ array.
Код PHP:
$str = "I am Summer. Everybody called me Summer. Susan is my girlfriend and she lives in Sunnyvale."; $pattern = "/S\w{1,}\s*/"; if(preg_match($pattern,$str,$array)){ print ("input: ".$str."\n"); print ("output: "); print_r($array); print "\n"; } if(preg_match_all($pattern,$str,$array)){ print ("input: ".$str."\n"); print ("output: "); print_r($array); print "\n"; } /*With Parentheses (Grouping) */ if(preg_match("/Su(mm)er/",$str,$array)){ print ("input: ".$str."\n"); print ("output: "); print_r($array); print "\n"; }
Вывод:
Как видно из рисунка 3.1, в первом массиве хранится только «Лето», потому что «Лето» - это первое слово, которое соответствует заданному шаблону в функции preg_match ().
С другой стороны, второй массив использует preg_match_all (). Таким образом, он хранит все слова, соответствующие шаблону (S \ w {1,} \ s *).
Третий вывод массива отличается от первого вывода массива, потому что он использует определенное слово и группу (круглые скобки) в качестве шаблона (/ Su (mm) er /). Таким образом, он сохраняет «Лето» и «мм» как первый и второй элемент массива соответственно.
Другой пример:
Код PHP:
/*Replace -number with ''*/ $str = "W-17WW111WBR-20RRLL2RLBB-88BBB3B9BWR1111L-30L15R7"; $pattern = '/-\d{1,}/'; $replacement = ''; $str= preg_replace($pattern, $replacement, $str); print ("After replacement: ".$str."\n"); while (strlen($str)!=0){ switch ($str){ case (preg_match("/^W\d{0,}/", $str, $matches, PREG_OFFSET_CAPTURE) ? true : false) : print("matches: "."/^W\d{0,}/"." pattern\n"); print("W follow by 0 or more digit(s)pattern matches\n"); print ("output: ".$matches[0][0] ."\n\n"); break; ... } }
Вывод:
По мотивации, которую я упомянул про инструкцию движения бота. Предположим, мы храним инструкцию в переменной $ str. Первое, что нам нужно сделать, это исключить отрицательное значение, заменив отрицательное число на «» (пустая строка).
Таким образом, я использую
$str = preg_replace($pattern, $replacement, $str); /* where $pattern = ‘/-\d{1,}/’; $replacement = ‘’; '/-\d{1,}' = the string contains '-' as the first character follows by at least 1 digit or more. */
Как видно из рисунка 4.1, {-17, -20,88, -30} заменяются на "" (пустой символ). После этого программа выполнит цикл и использует $ preg_match (), чтобы найти шаблон направления движения бота. Я хочу осветить единственную основную идею использования регулярных выражений. Таким образом, в этой статье я не предлагаю решение этой проблемы с перемещением ботов.
Вывод:
Регулярное выражение - это подход к идентификации определенного строкового шаблона с использованием подстановочных знаков. Это мощный инструмент для манипуляций со струнами. Как только вы научитесь применять регулярное выражение в вашей программе обработки строк, это сэкономит вам много строк кода.
P.S. Это первая статья, которую я публикую на Medium. Приношу свои извинения за любую ошибку, допущенную в этой статье. Я надеюсь, что эта статья принесет читателям меньшую или большую пользу.
Мой пример кода Github:
https://github.com/chanchailee/RegularExpression101
Ссылки:
Http://clevertechie.com/files/regex-cheat-sheet.png