Чередование и части выражений

Чередование в регулярном выражении позволяет группировать выборы между двумя и более вариантами. Можно по сути задавать шаблон вида "это ИЛИ то".

Части выражения позволяют находить совпадения с шаблоном в тексте и разделять совпадение на отдельные подстроки соответствия. Результирующие подстроки соответствия могут быть извлечены программой. Части выражения также позволяют переформатировать текст, см. раздел Обратные ссылки в JScript.

Для получения дополнительных сведений о регулярных выражениях см. раздел Создание регулярного выражения и Синтаксис регулярного выражения.

Чередование

Знак "|" может использоваться для того, чтобы задать выбор одного из нескольких вариантов. Это называется чередованием. Чередование соответствует наибольшему выражению, расположенному слева или справа от знака "|". Можно подумать, что следующее выражение JScript соответствует слову "Chapter" или "Section" с одной или двумя цифрами.

/Chapter|Section [1-9][0-9]{0,1}/

Однако регулярное выражение соответствует слову "Chapter" или слову "Section" и цифрам, следующим после. Если входная строка имеет значение "Section 22", то выражение соответствует строке "Section 22". Однако, если входная строка имеет значение "Chapter 22", то приведенное выражение соответствует слову "Chapter" вместо соответствия "Chapter 22".

Чередование с использованием круглых скобок

Чтобы сделать регулярные выражения более эффективными, можно использовать скобки для ограничения области чередования, то есть для применения чередования только к словам "Chapter" и "Section". Добавив круглые скобки, можно добиться соответствия регулярному выражению как фрагмента "Chapter 1", так и фрагмента "Section 3".

Круглые скобки, однако, также используются для создания частей выражения. Результирующая подстрока совпадения может быть извлечена программой.

В следующем регулярном выражении JScript скобки используются для группировки слов "Chapter" и "Section". Теперь слово "Chapter" со следующим за ним числом является возможным совпадением.

/(Chapter|Section) [1-9][0-9]{0,1}/

Скобки вокруг слов Chapter|Section также вызывают сохранение одного из совпадающих слов для использования в дальнейшем.

В следующем примере показано, как в коде ссылаться на соответствия и подстроки соответствия. Поскольку в приведенном выражении используется всего одна пара скобок, сохраняется только одно частичное совпадение.

var re = /(Chapter|Section) [1-9][0-9]{0,1}/g
var src = "Chapter 50  Section 85"
ShowMatches(src, re);

// Output:
//  Chapter 50
//  submatch 1: Chapter

//  Section 85
//  submatch 1: Section

// Perform a search on a string by using a regular expression,
// and display the matches and submatches.
function ShowMatches(src, re)
{
    var result;

    // Get the first match.
    result = re.exec(src);
    
    while (result != null)
    {
        // Show the entire match.
        print();
        print(result[0]);

        // Show the submatches.
        for (var index=1; index<result.length; index++)
            {
                print("submatch " + index + ": " + result[index]);
            }

        // Get the next match.
        result = re.exec(src);
    }
}

Чередование без сохранения частичного соответствия

В приведенном выше примере скобки необходимы только для группировки слов "Chapter" и "Section".

Чтобы предотвратить сохранение для последующего использования, можно задать часть выражения так: (?:шаблон). В следующем примере выполняются те же действия, что и в предыдущем, но без сохранения частичного соответствия.

var re = /(?:Chapter|Section) [1-9][0-9]{0,1}/g
var src = "Chapter 50  Section 85"
ShowMatches(src, re);
// Output:
//  Chapter 50
//  Section 85

Части выражения

Использование круглых скобок в регулярном выражении создает части выражения. Результирующая подстрока совпадения может быть извлечена программой.

В следующем примере регулярное выражение содержит три части выражения. Строки частичного соответствия отображаются вместе с каждым соответствием.

var re = /(\w+)@(\w+)\.(\w+)/g
var src = "Please send mail to george@contoso.com and someone@example.com. Thanks!"
ShowMatches(src, re);
// The ShowMatches function is provided earlier.

// Output:
//  george@contoso.com
//  submatch 1: george
//  submatch 2: contoso
//  submatch 3: com

//  someone@example.com
//  submatch 1: someone
//  submatch 2: example
//  submatch 3: com

Следующий пример показывает, как разделить универсальный код ресурса (URI) на отдельные компоненты.

Первая часть выражения в скобках сохраняет часть веб-адреса, соответствующую протоколу. Она соответствует любому слову, расположенному перед двоеточием и двумя знаками косой черты. Вторая часть выражения в скобках сохраняет часть веб-адреса, соответствующую адресу домена. Эта часть выражения соответствует любой последовательности знаков, в которую не входят знаки "/" или ":". Третья часть выражения в скобках сохраняет номер порта веб-сайта, если он указан. Эта часть выражения соответствует нулю и более цифр, расположенных после двоеточия. Четвертая часть выражения в скобках сохраняет путь и/или сведения о странице, указанные в веб-адресе. Она соответствует последовательности из нуля и более знаков, кроме "#" и знака пробела.

var re = /(\w+):\/\/([^\/:]+)(:\d*)?([^# ]*)/gi;
var src = "https://msdn.microsoft.com:80/scripting/default.htm";
ShowMatches(src, re);

// Output:
//  https://msdn.microsoft.com:80/scripting/default.htm
//  submatch 1: http
//  submatch 2: msdn.microsoft.com
//  submatch 3: :80
//  submatch 4: /scripting/default.htm

Позитивный и негативный поиск с упреждением

Позитивный поиск с упреждением — поиск, при котором после нахождения соответствия поиск следующего соответствия начинается до найденного текста. Соответствие не сохраняется для последующего использования. Чтобы задать позитивный поиск с упреждением следует использовать следующий синтаксис: (?=шаблон).

В следующем примере поиск должен установить, удовлетворяет ли пароль таким условиям: от 4 до 8 знаков и содержит как минимум одну цифру.

Регулярное выражение .*\d обнаруживает любое количество символов, за которыми следует цифра. Для строки "abc3qr" будет найдено соответствие "abc3". Если поиск начинается перед совпадением, а не после него, то выражение .{4,8} соответствует строке длиной от 4 до 8 символов. Это соответствует строке "abc3qr".

Символы ^ и $ задают позиции в начале и в конце строки, по которой выполняется поиск. Они используются, чтобы предотвратить совпадение, если строка, по которой выполняется поиск, содержит какие-то знаки до начала или после конца соответствия.

var re = /^(?=.*\d).{4,8}$/gi
var src = "abc3qr"
ShowMatches(src, re);
// The ShowMatches function is provided earlier.
// Output:
//  abc3qr

Негативный поиск с упреждением ищет строку, которая не соответствует шаблону в выражении негативного упреждения. После нахождения соответствия поиск следующего соответствия начинается до найденного текста. Соответствие не сохраняется для последующего использования. Чтобы задать негативный поиск с упреждением следует использовать следующий синтаксис: (?!шаблон).

Следующий пример соответствует словам, которые не начинаются с сочетания "th".

Регулярное выражение \b находит совпадения с границами слов. Для строки " quick " совпадением будет первый пробел. Выражение (?!th) соответствует строке, не равной "th". Совпадением будет строка "qu". Если поиск начат до этого совпадения, то выражение \w+ будет соответствовать слову. Совпадением будет строка "quick".

var re = /\b(?!th)\w+\b/gi
var src = "The quick brown fox jumps over the lazy dog."
ShowMatches(src, re);
// Output:
//  quick
//  brown
//  fox
//  jumps
//  over
//  lazy
//  dog

См. также

Основные понятия

Обратные ссылки в JScript

Другие ресурсы

Знакомство с регулярными выражениями