Многократное регулярное выражение в строке - PullRequest
5 голосов
/ 10 мая 2010

Как я могу применить несколько регулярных выражений к одной строке?

Например, пользователь вводит в текстовую область следующее:

red bird
blue cat
black dog

и я хочу заменить каждый возврат каретки запятой, а каждый пробел - подчеркиванием, чтобы окончательная строка читалась как red_bird, blue_cat, black_dog.

До сих пор я пробовал вариации синтаксиса в соответствии со следующим:

function formatTextArea() {
    var textString = document.getElementById('userinput').value;

    var formatText = textString.replace(
        new RegExp( "\\n", "g" ),",",
        new RegExp( "\\s", "g"),"_");

    alert(formatText);
}

Ответы [ 6 ]

5 голосов
/ 10 мая 2010

Вы можете заменить цепи. Каждое приложение метода replace повторяет строку, поэтому к этой строке вы можете применить replace снова. Как:

function formatTextArea() {
    var textString = document.getElementById('userinput').value;

    var formatText = 
         textString.replace(/\n/g,",")
                   .replace(/\s/g,"_");

    alert(formatText);
}

Кстати, нет необходимости во всех этих новых объектах регулярных выражений. Используйте литералы регулярных выражений (например, /\n/g выше).

В качестве альтернативы вы можете использовать лямбду для замены

const str = `red bird
blue cat
black dog`;
console.log(str.replace(/[\n\s]/g, a => /\n/.test(a) ? "," : "_"));
3 голосов
/ 10 мая 2010
formatText = textString.replace(/\n/g,',').replace(/\s/g,'_');
2 голосов
/ 10 мая 2010

Как уже упоминали другие, цепочка достаточно хороша для чего-то столь же простого, как то, что вы просите. Однако, если вы хотите, чтобы это было более динамичным, вы можете использовать функцию замены в качестве второго аргумента:

function formatTextArea() {
    var textString = document.getElementById('userinput').value;

    var formatText = textString.replace(/\n|\s/g, function ($0) {
        if ($0 === "\n")
            return ",";
        else if ($0 === " ")
            return "_";
    }
    alert(formatText);
}

Использование функции заменителя позволит вам быть динамичным без необходимости связывать вместе вызовы replace(). Это также может быть немного быстрее (анализатор регулярных выражений вызывается только один раз). Имейте в виду, что \s будет соответствовать больше, чем просто символ пробела, однако :-) Для целей вашего вопроса этого будет достаточно:

var formatText = textString.replace(/\n|\s/g, function ($0) {
    return $0 == "\n" ? "," : "_";
}
1 голос
/ 10 мая 2010

Regexp объект имеет свои собственные буквенные обозначения, используя прямые косые черты, что означает, что обратные косые черты не должны быть экранированы. Например, /\n/g эквивалентно new RegExp('\\n','g').

function formatTextArea()
{
    var textString = document.getElementById('userinput').value;

    textString = textString.replace(/\n/g,",").replace(/\s/g,"_");

    alert(textString);
}
0 голосов
/ 10 мая 2010
var textString = "red blue\nhack bye\ntest rt\n";
var formatText = textString.replace(new RegExp( "\\n", "g" ),",").replace(new RegExp( "\\s", "g"),"_");
alert(formatText);
0 голосов
/ 10 мая 2010

Включите http://phpjs.org/functions/str_replace:527, а затем

input = str_replace("\\n", ',', input);
input = str_replace(' ', '_', input); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...