Javascript 正则表达式替换所有不在引号中的令牌?

Javascript 正则表达式替换所有不在引号中的令牌?,javascript,regex,Javascript,Regex,我试图用JavaScript处理一些输入数据,因此我需要用一个包装原始标记的字符串替换所有字符串标记(形式为“ID1”、“ID2”、“ID3”…)。例如,“ID1”变为“table['ID1']”。但是,如果原始标记用引号(单引号或双引号)包装,则必须忽略它 例如,输入字符串: var input = "ID10 \"ID0\" FOO 'ID0' #ID0# ID10 BAR ID1 ID0."; 应成为: "table['ID10'] \"ID0\" FOO 'ID0' #table['I

我试图用JavaScript处理一些输入数据,因此我需要用一个包装原始标记的字符串替换所有字符串标记(形式为“ID1”、“ID2”、“ID3”…)。例如,“ID1”变为“table['ID1']”。但是,如果原始标记用引号(单引号或双引号)包装,则必须忽略它

例如,输入字符串:

var input = "ID10 \"ID0\" FOO 'ID0' #ID0# ID10 BAR ID1 ID0.";
应成为:

"table['ID10'] \"ID0\" FOO 'ID0' #table['ID0']# table['ID10'] BAR table['ID1'] table['ID0']."
我目前可以使用以下代码()获得一些方法:

这将产生以下输出:

ID10 "ID0" FOO 'ID0' table['ID0']#table['ID10'] BARtable['ID1']table['ID0'].
它似乎接近工作状态,但是第一个id(ID10)被忽略,匹配前的第一个字符丢失


任何人都可以建议如何正确处理此问题,谢谢。

我想您需要一个负前瞻令牌

看一看

整个正则表达式是

(ID\d+(?!\\))
负前瞻是
(?!…)
。它只是断言数字后面的下一个字符不是反斜杠

所以代码应该是类似于

var re = /(ID\d+(?!\\))/g; 
var str = 'ID10 \"ID0\" FOO \'ID0\' #ID0# ID10 BAR ID1 ID0.';
var subst = 'table[\'$1\']'; 
var result = str.replace(re, subst);
// table['ID10'] \"ID0\" FOO 'table['ID0']' #table['ID0']# table['ID10'] BAR table['ID1'] table['ID0'].

您可以根据
String#replace
中的替换使用此正则表达式,使用回调函数:

var input = "ID10 \"ID0\" FOO 'ID0' #ID0# ID10 BAR ID1 ID0.";
var r= input.replace(/"[^"]*"|'[^']*'|(ID\d+)/g, function($0, $1) {
       return ($1)? "table['"+$1+"']" : $0;});
//=> table['ID10'] "ID0" FOO 'ID0' #table['ID0']# table['ID10'] BAR table['ID1'] table['ID0'].

编辑Javascript中似乎不支持零宽度负向后看,因此需要零宽度负向前看,以检查ID加上数字后的下一个字符不是反斜杠、单引号或双引号

你可以试试

/(ID\d+(?![\\\'\"]))/g
/(?<![\"\'])ID\d+/g

编辑忘掉这一切

你需要一个零宽度的负片

你可以试试

/(ID\d+(?![\\\'\"]))/g
/(?<![\"\'])ID\d+/g