2017-04-19 61 views
2

我在這裏卡住了,有人可以幫我解決這個謎團嗎?奇怪的空格字符不能匹配

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/

在此先感謝

+0

這是一個不間斷的空間,'\ xA0'。使用'\ s'來匹配它。 –

回答

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 - 匹配單個空白字符,包括空格,製表符,換頁符,l喂飼料。相當於[ \f\n\r\t\v\u00a0\u1680\u180e\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]

+1

就是這樣。更新小提琴。我會在6分鐘內接受。謝謝 ! – OguzGelal

1

查看十六進制編輯器中的代碼。在第一個字符串中,您有一個不可破壞的空間(0xa0)而不是正常空間(0x20)。

使用\s而不是您的正則表達式中的文字空間來避免此問題(除非您需要區分空格,製表符和換行符)。