Choy
Choy

Reputation: 2117

Multiple Regex on String

How can I apply multiple regexs to a single string?

For instance, a user inputs the following into a text area:

red bird
blue cat
black dog

and I want to replace each carriage return with a comma and each space with an underscore so the final string reads as red_bird,blue_cat,black_dog.

I've tried variations in syntax along the lines of the following so far:

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

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

    alert(formatText);
}

Upvotes: 7

Views: 5935

Answers (6)

KooiInc
KooiInc

Reputation: 122906

You can chain the replacements. Every application of the replace method retuns a string, so on that string you can apply replace again. Like:

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

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

    alert(formatText);
}

There's no need for all these new Regular Expression Objects by the way. Use Regular Expression literals (like /\n/g in the above).

Alternatively you can use a lambda for the replacement

const str = `red bird
blue cat
black dog`;
console.log(str.replace(/[\n\s]/g, a => /\n/.test(a) ? "," : "_"));

Upvotes: 7

Andy E
Andy E

Reputation: 344565

As others have mentioned, chaining is good enough for something as simple as what you're asking. However, if you want this to be more dynamic, you can use a replacer function as the second argument:

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);
}

Using a replacer function will allow you to be dynamic without having to chain together calls to replace(). It may also be marginally faster (regex parser is invoked only once). Be aware that \s will match more than just the space character, though :-) For the purposes of your question, this would be good enough:

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

Upvotes: 3

powtac
powtac

Reputation: 41050

Include http://phpjs.org/functions/str_replace:527 and then

input = str_replace("\\n", ',', input);
input = str_replace(' ', '_', input); 

Upvotes: -3

ukanth
ukanth

Reputation: 2958

var textString = "red blue\nhack bye\ntest rt\n";
var formatText = textString.replace(new RegExp( "\\n", "g" ),",").replace(new RegExp( "\\s", "g"),"_");
alert(formatText);

Upvotes: 0

James
James

Reputation: 111910

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

Upvotes: 3

Eric
Eric

Reputation: 97571

Regexp object have their own literal notation, using forward slashes, meaning that backslashes don't have to be escaped. For example, /\n/g is equivalent to new RegExp('\\n','g').

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

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

    alert(textString);
}

Upvotes: 1

Related Questions