Если в команде указаны дополнительные аргументы после string, они считаются именами переменных, в которые возвращается информация о том, какие именно части строки соответствуют регулярным выражениям. Переменной присваивается значение, состоящее из части строки, соответствующей всему регулярному выражению. Самой левой в списке переменной subMatchVar присваивается значение, состоящее из части строки, которая соответствует самому левому заключенному в скобки выражению в составе exp. Следующей переменной subMatchVar присваивается значение, соответствующее следующему заключенному в скобки выражению, и так далее.
Если первые аргументы команды начинаются с “-”, они считаются опциями команды. Ниже перечислены возможные опции.
-nocase
Ветвь состоит из одной или более частей (piece), соединенных друг с другом. строка соответствует ветви, если ее можно разбить на подстроки таким образом, что начальная подстрока соответствует первой части ветви, следующая подстрока — следующей части ветви и так далее.
Часть состоит из атома со следующим за ним необязательным символом '*', '+' или '?'. Атом с последующим символом ‘*’ соответствует любой последовательности из нуля или более подстрок, каждая из которых соответствует атому. Атом с символом '+' после него соответствует любой последовательности из одной или более подстрок, каждая из которых соответствует атому. Атом с символом '?' после него соответствует подстроке, которая соответствует атому, или пустой строке.
Атом может быть регулярным выражением в скобках (в этом случае он соответствует любой строке, которая соответствует этому регулярному выражению), интервалом (см. ниже), символом '.' (соответствует ровно одному произвольному символу), '^' (соответствует нулевой строке в начале string), '$' (соответствует нулевой строке в конце string), '\' с последующим одним символом (соответствует этому символу), или одним символом без какого-либо иного смысла (соответствует этому символу).
Интервал есть последовательность символов,
заключенная в квадратные скобки. Он обычно соответствует любому символу из
этого интервала. Если последовательность начинается с символа '^',
то она соответствует любому символу, кроме символов, стоящих далее в последовательности.
Если два символа в последовательности разделены символом '-', то это
краткая форма для обозначения всех ASCII символов между этими двумя (например,
'[0-9]' соответствует любой десятичной цифре). Для того, чтобы включить в
последовательность символ ']', следует поставить его на место первого
в последовательности (следом за возможным символом '^'). Для включения
в последовательность символа '-' следует сделать его первым или последним
символом.
[1]
Если регулярное выражение соответствует двум разным частям строки, выбирается та часть, которая раньше начинается.
Если обе начинаются в одном и том же месте, то это неопределенный (тяжелый) случай. Его можно объяснить следующим образом.
[2]
Если регулярное выражение содержит символы ‘|’ (то есть состоит из нескольких ветвей), то будет выбрана самая левая ветвь, которой что-либо соответствует
[3]
Для выражений, содержащих '*', '+' и '?’, выбираются самые длинные фрагменты строки, соответствующие им.
[4]
Компоненты выражений рассматриваются слева направо.
В приведенном выше примере ‘(a*)b*’ соответствует ‘aab’, так как для ‘(a*)’ выбирается первый соответствующий ему фрагмент, то есть начальные ‘aa’, а затем для ‘b*’ выбирается следующий символ ‘b’. Рассмотрим еще один пример: