Сравнивает строку и регулярное выражение.
regexp ?switches? exp string ?matchVar? ?subMatchVar subMatchVar...?
Команда определяет, соответствует ли регулярное выражениеexp какой-либо части строки string или всей строке, и возвращает 1, если соответствует, и 0 - в противном случае.
Если в команде указаны дополнительные аргументы после string, они считаются именами переменных, в которые возвращается информация о том, какие именно части строки соответствуют регулярным выражениям. Переменной присваивается значение, состоящее из части строки, соответствующей всему регулярному выражению. Самой левой в списке переменной subMatchVar присваивается значение, состоящее из части строки, которая соответствует самому левому заключенному в скобки выражению в составе exp. Следующей переменной subMatchVar присваивается значение, соответствующее следующему заключенному в скобки выражению, и так далее.
Если первые аргументы команды начинаются с -, они считаются опциями команды. Ниже перечислены возможные опции.
Если в команде указано больше переменных subMatchVar, чем выражений в скобках в exp, или если для одного из выражений не удалось найти соответствующую ему часть строки, то соответствующей переменной будет присвоено значение -1 или пустая строка, в зависимости от того, была ли задана опция -indices.
Регулярное выражение состоит из ни одной или более ветвей (branch), разделенных символом '|'. Строка соответствует выражению, если она соответствует одной из его ветвей.
Ветвь состоит из одной или более частей (piece), соединенных друг с другом. строка соответствует ветви, если ее можно разбить на подстроки таким образом, что начальная подстрока соответствует первой части ветви, следующая подстрока - следующей части ветви и так далее.
Часть состоит из атома со следующим за ним необязательным символом '*', '+' или '?'. Атом с последующим символом * соответствует любой последовательности из нуля или более подстрок, каждая из которых соответствует атому. Атом с символом '+' после него соответствует любой последовательности из одной или более подстрок, каждая из которых соответствует атому. Атом с символом '?' после него соответствует подстроке, которая соответствует атому, или пустой строке.
Атом может быть регулярным выражением в скобках (в этом случае он соответствует любой строке, которая соответствует этому регулярному выражению), интервалом (см. ниже), символом '.' (соответствует ровно одному произвольному символу), '^' (соответствует нулевой строке в начале string), '$' (соответствует нулевой строке в конце string), '\' с последующим одним символом (соответствует этому символу), или одним символом без какого-либо иного смысла (соответствует этому символу).
Интервал есть последовательность символов, заключенная в квадратные скобки. Он обычно соответствует любому символу из этого интервала. Если последовательность начинается с символа '^', то она соответствует любому символу, кроме символов, стоящих далее в последовательности. Если два символа в последовательности разделены символом '-', то это краткая форма для обозначения всех ASCII символов между этими двумя (например, '[0-9]' соответствует любой десятичной цифре). Для того, чтобы включить в последовательность символ ']', следует поставить его на место первого в последовательности (следом за возможным символом '^'). Для включения в последовательность символа '-' следует сделать его первым или последним символом.
Вообще говоря, регулярное выражение может соответствовать строке несколькими различными способами. Например, рассмотрим выражение
regexp (a*)b* aabaaabb x y
В соответствии с описанными выше правилами переменные x и y могут принять значение aabb и aa, aaab и aaa, ab и a или одну из еще нескольких возможных комбинаций. Чтобы избежать этой потенциальной неопределенности команда regexp выбирает между возможными вариантами по правилу "первый и самый длинный". Другими словами, строка и регулярное выражение просматриваются слева направо, при этом выбирается часть строки максимально возможной длины. Говоря точнее, при выборе используются следующие правила в порядке убывания приоритета.
В приведенном выше примере (a*)b* соответствует aab, так как для (a*) выбирается первый соответствующий ему фрагмент, то есть начальные aa, а затем для b* выбирается следующий символ b. Рассмотрим еще один пример:
regexp (ab|a)(b*)c abc x y z
После выполнения команды переменная x будет содержать значение abc, переменная y - ab и переменная z будет содержать пустую строку. Правило [4] определяет, что поиск начнется с выражения (ab|a), а правило [2], что поиск начнется с подвыражения ab. Поэтому символ b в строке будет использован, и выражение (b*) будет соответствовать пустой строке.