Группы символов в регулярных выражениях PHP

Существуют специальные команды, которые позволяют выбрать сразу целые группы символов. Команда \d означает цифру от 0 до 9. Команда \w обозначает цифру, латинскую букву или знак подчеркивания. Команда \s обозначает пробел или пробельный символ: пробел, перевод строки, табуляцию. Можно инвертировать значение команды, написав большую букву: например, если \d - цифра, то \D - не цифра.

Пример

Давайте найдем все цифры:

php<?php
  $str = '1 12 123';
  $res = preg_replace('#\d#', '!', $str);
?>

В результате в переменную запишется следующее:

php'! !! !!!'

Пример

Операторы повторения считают команды-группы одним целым, то есть группирующие скобки не нужны. В следующем примере шаблон поиска выглядит так: цифра от 0 до 9 один или более раз:

php<?php
  $str = '1 12 123 abc @@@';
  $res = preg_replace('#\d+#', '!', $str);
?>

В результате в переменную запишется следующее:

php'! ! ! abc @@@'

Пример

В следующем примере шаблон поиска выглядит так: все что угодно один или более раз, но не цифра от 0 до 9:

php<?php
  $str = '123abc3@@';
  $res = preg_replace('#\D+#', '!', $str);
?>

В результате в переменную запишется следующее:

php'123!3!'

Пример

В данном примере шаблон поиска выглядит так: пробельный символ один раз:

php<?php
  $str = '1 12 123 abc @@@';
  $res = preg_replace('#\s#', '!', $str);
?>

В результате в переменную запишется следующее:

php'1!12!123!abc!@@@'

Пример

В данном примере шаблон поиска выглядит так: НЕ пробельный символ один или более раз. Все подстроки, разделенные пробелами, заменятся на '!':

php<?php
  $str = '1 12 123 abc @@@';
  $res = preg_replace('#\S+#', '!', $str);
?>

В результате в переменную запишется следующее:

php'! ! ! ! !'

Пример

В данном примере шаблон поиска выглядит так: цифра или буква один или более раз. Все подстроки, состоящие из цифр и букв, заменятся на '!':

php<?php
  $str = '1 12 123a Abc @@@';
  $res = preg_replace('#\w+#', '!', $str);
?>

В результате в переменную запишется следующее:

php'! ! ! ! @@@'

Пример

В данном примере шаблон поиска выглядит так: НЕ цифра и НЕ буква один или более раз. Под данное определение в нашем случае попадает '@@@' и все пробелы (они ведь тоже не цифры и не буквы). Обратите внимание на то, что в конце один '!' - в него преобразовалась строка ' @@@' - с пробелом впереди:

php$str = '1 12 123 Abc @@@';
$res = preg_replace('#\W+#', '!', $str);

В результате в переменную запишется следующее:

php'1!12!123!Abc!'

Практические задачи

Задание 1

Дана строка:

php<?php
  $str = 'a1a a2a a3a a4a a5a aba aca';
?>

Напишите регулярку, которая найдет строки, в которых по краям стоят буквы 'a', а между ними одна цифра.

Задание 2

Дана строка:

php<?php
  $str = 'a1a a22a a333a a4444a a55555a aba aca';
?>

Напишите регулярку, которая найдет строки, в которых по краям стоят буквы 'a', а между ними любое количество цифр.

Задание 3

Дана строка:

php<?php
  $str = 'aa a1a a22a a333a a4444a a55555a aba aca';
?>

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

Задание 4

Дана строка:

php<?php
  $str = 'avb a1b a2b a3b a4b a5b abb acb';
?>

Напишите регулярку, которая найдет строки следующего вида: по краям стоят буквы 'a' и 'b', а между ними - не число.

Задание 5

Дана строка:

php<?php
  $str = 'ave a#b a2b a$b a4b a5b a-b acb';
?>

Напишите регулярку, которая найдет строки следующего вида: по краям стоят буквы 'a' и 'b', а между ними - не буква и не цифра.

Задание 6

Дана строка:

php<?php
  $str = 'ave a#a a2a a$a a4a a5a a-a aca';
?>

Напишите регулярку, которая заменит все пробелы на '!'.