2011-03-15 19 views
11

मुझे एक साधारण नियमित अभिव्यक्ति मिलान के साथ बहुत सारी समस्याएं आ रही हैं। b और अंतरराष्ट्रीय वर्णों के साथ जावास्क्रिप्ट नियमित अभिव्यक्ति समस्या

मेरे पास यह स्ट्रिंग उच्चारण अक्षरों के साथ है (यह केवल एक उदाहरण है) "Botó Entrepà Nadó Facebook! " और मैं किसी अन्य सूची से शब्दों का उपयोग करके शब्दों से मेल खाना चाहता हूं।

यह मेरे कोड का एक सरल संस्करण है। उदाहरण के लिए "Botó" मैच के लिए

var matchExpr = new RegExp ('\\b' + 'Botó' + '\\b','i'); 
"Botó Entrepà Nadó Facebook! ".match(matchExpr); 

अगर मैं इसे चलाने, यह मेल नहीं खाता "Botó" के रूप में उम्मीद (Firefox, IE और क्रोम)।

मैंने सोचा कि यह मेरी तरफ एक त्रुटि थी। लेकिन यहाँ मज़ा ...

मैं इस "Botón Entrepà Nadó Facebook! " तरह स्ट्रिंग को संशोधित करते हैं आता है (नोटिस "n" के बाद "Botó") और मैं एक ही कोड चलाएँ:

var matchExpr = new RegExp ('\\b' + 'Botó' + '\\b','i'); 
"Botón Entrepà Nadó Facebook! ".match(matchExpr); 

यह मेल खाता है "Botó" !!!! ????? (कम से कम फ़ायरफ़ॉक्स में)। यह मेरे लिए समझ में नहीं आता है "n" शब्द सीमा नहीं है (जो \b से मेल खाती है)।

आप पूरे शब्द मैच के लिए प्रयास करते हैं तो:

var matchExpr = new RegExp ('\\b' + 'Botón' + '\\b','i'); 
"Botón Entrepà Nadó Facebook! ".match(matchExpr); 

यह काम करता है।

इसे थोड़ा और अजीब बनाने के लिए, हम अंत में एक और उच्चारण पत्र जोड़ते हैं।

var matchExpr = new RegExp ('\\b' + 'Botóñ' + '\\b','i'); 
"Botóñ Entrepà Nadó Facebook! ".match(matchExpr); 

यदि हम इससे मिलान करने का प्रयास करते हैं, तो यह कुछ भी मेल नहीं खाता है। लेकिन, अगर हम इस

var matchExpr = new RegExp ('\\b' + 'Botóñ' + '\\b','i'); 
"Botóña Entrepà Nadó Facebook! ".match(matchExpr); 

कोशिश यह मेल खाता है "Botóñ"। क्या गलत है।

यदि हम "फेसबुक" से मिलान करने का प्रयास करते हैं तो यह अपेक्षा के अनुसार काम करता है। यदि आप मध्य में उच्चारण के साथ शब्दों से मिलान करने का प्रयास करते हैं, तो यह अपेक्षा के अनुसार काम करता है। लेकिन यदि आप अंत में एक उच्चारण के साथ शब्दों से मिलान करने का प्रयास करते हैं, तो यह विफल हो जाता है।

मैं क्या गलत कर रहा हूं? क्या यह अपेक्षित व्यवहार है?

उत्तर

5

दुर्भाग्य से, जावास्क्रिप्ट में शॉर्टेंड चरित्र वर्ग यूनिकोड (या यहां तक ​​कि उच्च ASCII) का समर्थन नहीं करते हैं।

इस प्रश्न के उत्तर पर एक नज़र डालें: Javascript + Unicode। यह लेख, इस सवाल का, JavaScript, Regex, and Unicode में जुड़ा हुआ है, का कहना है कि \b एक शब्द सीमा है, जो के रूप में परिभाषित किया गया है द्वारा परिभाषित किया गया है:

→ वर्ड चरित्र - केवल अक्षर A-Z, एक-z, 0-9, और _।
→ शब्द सीमा - शब्द वर्ण और गैर-शब्द वर्ण के बीच की स्थिति।

तो यह अंत में A-Z, a-z, 0-9, and _ वाले शब्दों के लिए काम करेगा, लेकिन अंत में उच्चारण वर्णों के साथ नहीं।

+0

* तो यह अंत में उच्चारण के साथ शब्दों के लिए काम करेगा, लेकिन अंत में उच्चारण के साथ नहीं। *? –

+0

मुझे लगता है कि आपकी आखिरी वाक्य को थोड़ी मदद की ज़रूरत है ... – Pointy

+0

@ फ़ेलिक्स @ प्वाइंट धन्यवाद, निश्चित –

3

ES3 कल्पना से:

आंतरिक सहायक समारोह IsWordChar एक पूर्णांक पैरामीटर ई लेता है और करता है निम्नलिखित:

  1. तो ई == -1 या ई == InputLength, विवरण झूठा है।
  2. सी चरित्र इनपुट [ई] होने दें।
  3. यदि सी नीचे दी गई तालिका में साठ-तीन वर्णों में से एक है, तो सत्य वापस आएं।

    a b c d e f g h i j k l m n o p q r s t u v w x y z 
    A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 
    0 1 2 3 4 5 6 7 8 9 _ 
    
  4. झूठी वापसी।

"IsWordChar()" आंतरिक (संभवतः काल्पनिक) समारोह "\ ख" दावे के लिए व्यवहार का आधार है।

संपादित करें — यह ES5 में बेहतर नहीं है।

संबंधित मुद्दे