Поделиться через


Программирование регулярных выражений

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

Поиск

Следующий пример JScript находит все вхождения слова.

Регулярное выражение создается инструкцией

var re = /\w+/g;

Шаблон /\w+/ указывает сопоставить один или несколько любых символов из числа следующих: A-Z, a-z, 0-9 и символ подчеркивания. Глобальный флаг g, следующий за шаблоном, указывает, что следует найти все вхождения шаблона, а не только первое вхождение.

Можно также использовать следующий альтернативный синтаксис JScript.

var re = new RegExp("\\w+", "g");

Чтобы извлечь все соответствия, Метод exec продолжает поиск, начиная с позиции lastIndex и пока не будет возвращено значение null.

function SearchGlobal()
{
    var src = "The quick brown fox jumps over the lazy dog.";

    // Create a regular expression pattern that has a global flag.
    var re = /\w+/g;

    var result;

    // Get the first match.
    result = re.exec(src);
    while (result != null)
    {
        print (result.index + "-" + result.lastIndex + "\t" + result[0]);

        // Get the next match.
        // Because the global flag is set, the search starts at the
        // position of lastIndex.
        result = re.exec(src);
    }

    // Output:
    //  0-3 The
    //  4-9 quick
    //  10-15 brown
    //  16-19 fox
    //  20-25 jumps
    //  26-30 over
    //  31-34 the
    //  35-39 lazy
    //  40-43 dog
}

Следующий пример находит лишь первое соответствие. Поскольку глобальный флаг (g) не установлен, поиск начинается с начала строки поиска.

function SearchNonGlobal()
{
    var src = "The quick brown fox jumps over the lazy dog.";

    // Create a regular expression that does not have
    // a global flag.
    var re = /\w+/;

    // Get the first match.
    // Because the global flag is not set, the search starts
    // from the beginning of the string.
    var result = re.exec(src);

    if (result == null)
        print ("not found");
    else
        {   
        print (result.index + "-" + result.lastIndex + "\t" + result[0]);
        }

    // Output:
    //  0-3 The
}

Замена

В следующем примере вхождения "the" заменены на "a". Единичное вхождение "The" не заменено, поскольку флаг i (не учитывать регистр) не включен в регулярное выражение.

В примере используется метод Метод replace.

function ReplaceGlobal()
{
    var src = "The batter hit the ball with the bat ";
    src += "and the fielder caught the ball with the glove.";

    // Replace "the" with "a".
    var re = /the/g;
    var result = src.replace(re, "a");

    print(result);

    // Output:
    //  The batter hit a ball with a bat and a fielder caught a ball with a glove.
}

Извлечение подстрок

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

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

Метод exec возвращает массив. Нулевой элемент массива содержит соответствие целиком, а элементы с 1 по n содержат подстроки соответствия.

function SearchWithSubmatches()
{
    var result;

    var src = "Please send mail to george@contoso.com and someone@example.com. Thanks!";

    // Create a regular expression to search for an e-mail address.
    // Include the global flag.
    // (More sophisticated RegExp patterns are available for
    // matching an e-mail address.)
    var re = /(\w+)@(\w+)\.(\w+)/g;

    // Get the first match.
    result = re.exec(src);
    while (result != null)
    {
        print ("e-mail address: " + result[0]);

        // Get the submatched parts of the address.
        print ("user name: " + result[1]);
        print ("host name: " + result[2]);
        print ("top-level domain: " + result[3]);
        print ("");

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

    // Output:
    //  e-mail address: george@contoso.com
    //  user name: george
    //  host name: contoso
    //  top-level domain: com

    //  e-mail address: someone@example.com
    //  user name: someone
    //  host name: example
    //  top-level domain: com
}

Флаги

В регулярном выражении JScript /abc/gim элемент g задает глобальный флаг, i — флаг "не учитывать регистр", а m — флаг многострочности.

В следующей таблице отображены разрешенные флаги.

Флаг JScript

Если флаг присутствует

g

Найти все вхождения шаблона в строке, в которой ведется поиск, а не только первое вхождение

i

При поиске регистр не учитывается.

m

^ сопоставляет позиции после \n или \r, и

$ сопоставляет позиции перед \n или \r.

Независимо от присутствия флага, ^ сопоставляет позицию в начале, а $ — в конце строки, в которой ведется поиск.

Дополнительные возможности

Доступны следующие дополнительные функции программирования.

Функция

Описание

Метод compile (Visual Studio — JScript)

Выполняет компиляцию регулярного выражения во внутренний формат для более быстрого выполнения

Метод test

Проверяет, встречается ли шаблон в строке, в которой ведется поиск

Метод search

Возвращает позицию первого соответствия

См. также

Ссылки

Объект Regular Expression

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

Создание регулярного выражения

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