0

我有以下字符串

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

我想将"标签定义中的所有字符替换为'具有使用String.replace()功能的字符。"标签内容中的字符必须保持其当前形式。

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

也许可以使用带有一些分组的正则表达式?

4

4 回答 4

1

您可以使用replace()regex-callback 为您执行此操作:

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

正则表达式将匹配字符串中的任何中间字符<>字符,并将匹配项传递给replaceCallback()方法,然后根据需要"'字符替换。

编辑:正在replaceCallback()使用.replace('"', "'"),但这只会替换第一个". 我已将其更新为使用正则表达式替换,现在它可以按预期工作。

于 2012-08-09T16:31:27.240 回答
1

以下代码(取自该问题的已接受答案)也可以工作,无需回调,但使用不太容易理解的正则表达式。

var str = 'content " content <tag attr1="val1" attr2="val2">content " content</tag> content " content';
str = str.replace(/"(?=[^<]*>)/g, "'");
于 2012-08-09T16:37:14.000 回答
1
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. 
});
于 2012-08-09T16:38:37.890 回答
1

你不能只用一个正则表达式,你必须使用一个组合。这是要走的路:

  1. 匹配标签内的文本,这很容易。
  2. 使用替换将上一个匹配的输出中的字符替换为您想要的字符,这也很容易,因为您已经完成了上一个匹配。

向你致敬!不管你是谁。

于 2012-08-09T16:38:41.520 回答