javascript регулярное выражение несколько запросов - PullRequest
1 голос
/ 13 февраля 2010

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

Есть ли способ сделать все это одним вызовом, например (не работает)?

str.replace(/query1|query2|query3|query4|...|[0-9]+|[^]/,
             "reslt1|reslt2|reslt3|reslt4|...|procNumb|procChar");

Нужно работать только в Firefox. Прямо сейчас я застрял с:

str.replace(... ,function(a,b,c){if (a=="query1") return "reslt1"; ..............});

Спасибо!

Редактировать: Извините, если запутался. Цель:

До: "query1query3x123query2" После: "reslt1reslt3procChar (x) procNumb (123) reslt2"

Главное, мне нужно, чтобы я обрабатывал фрагмент строки 1 за один раз рекурсивно, поэтому я думаю, что должен использовать такой супер-запрос, чтобы соответствовать любому, или вообще не использовать регулярные выражения. Мне просто интересно, есть ли способ автоматически связывать результаты с запросами при использовании большого количества каналов. Я не очень знаком с регулярными выражениями javascript, но, к сожалению, ничего не могу найти на mdc.

Ответы [ 3 ]

1 голос
/ 13 февраля 2010

Если вы пытаетесь сопоставить любую из нескольких альтернативных подстрок и предоставлять разные результаты для каждого совпадения, вам придется использовать функцию (как вы, кажется, делаете).Например:

var str = "ABCDE";

str = str.replace(/A|B|C|D/g, function(match) {
    var rv;
    switch (match)
    {
        case 'A':
            rv = '1';
            break;
        case 'B':
            rv = '2';
            break;
        case 'C':
            rv = '3';
            break;
        case 'D':
            rv = '4';
            break;
    }
    return rv;
});
alert(str); // Alerts 1234E

(Конечно, этот конкретный пример лучше выполнить как поиск по массиву.)

Если вы изверг с вертикальной краткостью (я нет, нонекоторые из них), вы можете использовать ранние возвраты:

str = str.replace(/A|B|C|D/g, function(match) {
    switch (match)
    {
        case 'A': return '1';
        case 'B': return '2';
        case 'C': return '3';
        case 'D': return '4';
    }
});
alert(str); // Alerts 1234E

Редактировать Просто чтобы прояснить мой комментарий «поиск по массиву» выше: Если замены действительно являются просто статическим поиском,Вы можете сделать это:

var str, replacements, key, rex;

// Potentially one-time prep, if you're re-using this lookup
replacements = {
    "A": "1",
    "B": "2",
    "C": "3",
    "D": "4"
};
rex = [];
for (key in replacements)
{
    rex.push(key);
}
rex = new RegExp(rex.join('|'), "g");

// The bit you reuse
str = "ABCDE";
str = str.replace(rex, function(match) {
    return replacements[match];
});
alert(str); // Alerts 1234E

..., поскольку объекты JavaScript являются ассоциативными массивами.

0 голосов
/ 13 февраля 2010

Если вы хотите заменить query1 на reslt1, query2 на reslt2 и т. Д., Я не думаю, что это можно сделать с помощью одного регулярного выражения.Однако довольно просто использовать массив Nx2 (или объект, но его определение будет более подробным):

var repl_table = [[/query1/g, 'reslt1'],
                  [/query2/g, 'reslt2'],
                  [/query3/g, 'reslt3'],
                  [/query4/g, 'reslt4'],
                  [/([0-9]+)/g, 'procNumb($1)'],
                  [/([^])/g, 'procChar($1)']]

function repl(s, table) {
  for (var i=0; i<table.length; i++) {
    s = s.replace(table[i][0], table[i][1]);
  }
  return s;
}

// Then call:
result = repl(source, repl_table);
0 голосов
/ 13 февраля 2010

Почему бы вам не запустить их один за другим в цикле, например:

for (var i = 0; i < regexes.length; i++) {
    str = str.replace(regexes.regex, regexes.result);
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...