给定一个字符串,其中包含若干个"
,如:
var str = 'a"b\"b"a';
通过charAt可以得知,1,3,5位置上的字符都是"
。
console.log(str.charAt(1) === '"'); // true
console.log(str.charAt(3) === '"'); // true
console.log(str.charAt(5) === '"'); // true
现在有什么方法能都得知,第2个"
是被转义的,与另两个"
是有差别的?
问题背景,在对一个字符串做词法解析时,需要逐个遍历字符找出正确的
"
匹配,希望忽略掉被转义的"
。
希望能够试用于若干个"
的情况,如:
var str = 'a"b\"b\"b"a';
请高人指点,感谢。
补一个使用场景的case:
有一段数据,比如:
var data = { "key": { "a'b" : "foo" } };
然后view中有个模板,如下,运行正常。
{{key["a'b"]}}
上面的模板是没问题的,但因为模板的是给别人写的,有的人写成下面这样,解析失败了。
{{key['a\'b']}}
从书写模板的层面来看,使用者没有犯错,所以希望在模板引擎内部编译时,能找个方法正确忽略掉转义的引号。这里要得到的确实是a'b
的值(foo),而不是a\'b
的值(undefined)。
问题在于,在JS中如果你要表示一个内容为
a"b\"b"a
的字符串,应该写成'a"b\\"b"a'
var str = 'a"b\"b\"b"a';
其实等价于var str = 'a"b"b"b"a';
无从解决匹配的问题。那么我们现在偷换一下题目,加上反斜杠,也就是找
var str = 'a"b\\"b\\"b"a';
这个字符串中的匹配双引号。这其实就是微型的词法分析,简单来说就是用状态机搞定
每个字符进来的时候根据当前状态来决定应该进入什么状态,执行什么操作。比如从普通状态进入字符串内状态的时候要记录下位置(起点),从字符串内状态返回普通状态的时候记录下终点位置,形成一对引号。
另外『内容结束』也可以作为一种特殊的字符,然后比如在字符串内这个状态遇到『内容结束』,就是编译器/解释器经常对你吼的
Grammar Error
啦写起来虽然不一样,但解释过后,这些引号在内存里都是一样的,无法区分。所以楼主的测试数据不能这么写。
要写成