Вы когда-нибудь запутались в использовании регулярных выражений?
Что это? Это мощно? Стоит ли тратить время на его изучение?
Сегодня я кратко расскажу о регулярных выражениях, а также проиллюстрирую некоторые примеры с использованием языка 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, которые мы можем использовать.

  1. 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