简体   繁体   中英

replace " using String.replace() with regex

I have following string

"content \" content <tag attr1=\"val1\" attr2=\"val2\">content \" content</tag> content \" content"

I want to replace all " characters inside tags definitions to ' character with use String.replace() function. " characters inside tag content must remain in its present form.

"content \" content <tag attr1='val1' attr2='val2'>content \" content</tag> content \" content"

Maybe is regex with some grouping can used?

You can use replace() and a regex-callback to do this for you:

var str = 'content " content <tag attr1="val1" attr2="val2">content " content</tag> content " content';

function replaceCallback(match) {
    return match.replace(/"/g, "'");
}

str = str.replace(/<([^>]*)>/g, replaceCallback);

The regex will match anything in-between < and > characters in your string and pass the matches to the replaceCallback() method which will then, as desired, replace " with ' characters.

Edit: The replaceCallback() was using .replace('"', "'") , but this would only replace the first " . I've updated it to use a regex-replace instead and it now works as-desired.

The following code (taken from the accepted answer to this question ) will also work, without a callback, but with a less easily understandable regex.

var str = 'content " content <tag attr1="val1" attr2="val2">content " content</tag> content " content';
str = str.replace(/"(?=[^<]*>)/g, "'");
var str = "content \" content <tag attr1=\"val1\" attr2=\"val2\">content \" content</tag> content \" content";

var replaced = str.replace(/\<.*?\>/g, function(match, index){ 
  return match.replace(/"/g, "'"); // `match` will be each tag , both opening and closing. 
});

You can't do it with just one regex, you must use a combination. This is the way to go:

  1. Match the text within the tags, this is easy.
  2. Replace the characters from the output of the previous match with the ones you want using replace, this is also easy, now that you have done the previous match.

Salute you! Whatever you are.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM