views:

82

answers:

6

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);
}
+1  A: 

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);
}
Eric
+3  A: 
formatText = textString.replace(/\n/g,',').replace(/\s/g,'_');
J-P
A: 

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

input = str_replace("\\n", ',', input);
input = str_replace(' ', '_', input); 
powtac
Javascript, not PHP
Eric
I changed it ;)
powtac
Why should you use *this*? JavaScript has a native [`replace`](https://developer.mozilla.org/En/Core_JavaScript_1.5_Reference/Objects/String/Replace) function.
Marcel Korpel
A: 
var textString = "red blue\nhack bye\ntest rt\n";
var formatText = textString.replace(new RegExp( "\\n", "g" ),",").replace(new RegExp( "\\s", "g"),"_");
alert(formatText);
TuxGeek
+2  A: 

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).

KooiInc
thanks for the explanation.
George
+1  A: 

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" ? "," : "_";
}
Andy E