3

I'm stumped...

http://codepen.io/anon/pen/rjjGEE

Why does the regex javascript string replace work for the string with special characters, but not the object converted to a string?

let regex = /[\t\r\n]/g

var directString = "{'name':{'first':' billy bob ','last':'\n\rjoe\tblow'}}"
console.log(directString.replace(regex, "a"));

//Output: "{'name':{'first':' billy bob ','last':'aajoeablow'}}"


let obj = {
      name: {
        first: " billy bob  ",
        last: "\n\rjoe\tblow"
      },

    }

let objAsString = JSON.stringify(obj);
let stringifiedString = objAsString.replace(regex, "a")
console.log(stringifiedString)

//Output: "{'name':{'first':' billy bob  ','last':'\n\rjoe\tblow'}}"

//??? Why isn't \n\r and \t being replaced????
1
  • You should log the values of directString and objAsString to the console. You will see that you have two different strings (and I'm not talking about the quotation marks). Commented Jan 19, 2017 at 1:23

2 Answers 2

3

When you use escapes like \n and \t in a string constant (like your first example), what you end up with is a string that contains the intended special characters (newline or tab).

When you JSON encode an object, however, what you end up with is a string that contains the escape sequences themselves, not the special characters. The work that JSON.stringify() does has to include making sure that a subsequent parse of the JSON will re-create the original values of all the string-valued object properties. Thus it turns the embedded special characters in the strings back into escape sequences. Your regular expression is looking for the special characters, not the escape sequences.

Sign up to request clarification or add additional context in comments.

Comments

2

Do not attempt to manipulate JSON strings with regexp. Pain will follow.

Instead, do this:

var jsonString = String.raw`{"a": "foo\nbar\rbaz\tqux"}`;

var replaced = JSON.stringify(JSON.parse(jsonString, (key, value) =>
      typeof value === 'string' ?  value.replace(/[\t\r\n]/g, '') : value
    ));
                                         
console.log(replaced);

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.