奇怪的空间角色无法匹配

时间:2017-04-19 13:19:59

标签: javascript regex unicode

我在这里坚持这个,有人可以帮助我解开这个谜团吗?

var t1 = "an excellence award can";
var t2 = "an excellence award can";
var r1 = t1.match('excellence award', 'gi'); 
var r2 = t2.match('excellence award', 'gi');
console.log(r1); // null (can't find it)
console.log(r2); // [...] (find it)

根据我的观察,t1在'卓越'和'奖励'之间有一个奇怪的空格特征,这可以防止正则表达式匹配单词excellence award。我复制了t1并制作了t2,然后我只是删除了该空格并再次手动将其重新放回,然后匹配。

很明显,这个空间有问题,但无法弄清楚是什么。这是jsfiddle:

https://jsfiddle.net/uw8m6far/

提前致谢

2 个答案:

答案 0 :(得分:2)

您的字符串包含一个不间断的空格,您可以在this Unicode converter中轻松找到它。

使用\s速记字符类来匹配任何空格,包括不间断的空格\u00A0

var t1 = "an excellence award can"; // Here, \u00A0 is between e and a
var t2 = "an excellence award can"; // Here is a regular ASCII space
var rx = /excellence\saward/gi;
var r1 = t1.match(rx); 
var r2 = t2.match(rx);
console.log(r1); 
console.log(r2); 

请参阅MDN reference

  

\s - 匹配单个空白字符,包括空格,制表符,换页符,换行符。相当于[ \f\n\r\t\v\u00a0\u1680\u180e\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]

答案 1 :(得分:1)

查看十六进制编辑器中的代码。在第一个字符串中,您有一个不可中断的空格(0xa0)而不是普通空格(0x20)。

在正则表达式中使用\s而不是文字空间来避免此问题(除非您需要区分空格,制表符和换行符)。