Javascript 正则表达式替换所有不在引号中的令牌?
我试图用JavaScript处理一些输入数据,因此我需要用一个包装原始标记的字符串替换所有字符串标记(形式为“ID1”、“ID2”、“ID3”…)。例如,“ID1”变为“table['ID1']”。但是,如果原始标记用引号(单引号或双引号)包装,则必须忽略它 例如,输入字符串: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
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