2010-05-21 12 views
19

में सीमा regex जावास्क्रिप्ट में:utf-8 शब्द जावास्क्रिप्ट

"ab abc cab ab ab".replace(/\bab\b/g, "AB"); 

सही ढंग से मुझे देता है:

"AB abc cab AB AB" 

जब मैं का उपयोग UTF-8 वर्णों हालांकि:

"αβ αβγ γαβ αβ αβ".replace(/\bαβ\b/g, "AB"); 

word boundary operator काम नहीं लग रहा है:

"αβ αβγ γαβ αβ αβ" 

क्या इसका कोई समाधान है?

+1

जावास्क्रिप्ट यूनिकोड के लिए 'यूटीएफ -8' का उपयोग नहीं करता है। मानक के मुताबिक एक कार्यान्वयन या तो 'यूसीएस -2' या 'यूटीएफ -16' का उपयोग कर सकता है। इसका मतलब है कि या तो आप टेक्स्ट पर काम कर रहे हैं जिसे इन प्रारूपों में से एक में परिवर्तित कर दिया गया है, या आप टेक्स्ट पर काम कर रहे हैं, जहां प्रत्येक यूनिकोड कोडपॉइंट के प्रत्येक "ऑक्टेट" (बाइट) को इन प्रारूपों में से एक में परिवर्तित कर दिया गया है, इस पर निर्भर करता है कि आपका कोड पाठ प्राप्त करता है। – hippietrail

उत्तर

22

शब्द धारणा केवल तभी मेल खाती है जब कोई शब्द वर्ण पहले या किसी अन्य शब्द चरित्र के बाद नहीं होता है (इसलिए .\b.\W\w और \w\W के बराबर है)। और \w को [A-Za-z0-9_] के रूप में परिभाषित किया गया है। तो \w यूनानी वर्णों से मेल नहीं खाता है। और इस प्रकार आप इस मामले के लिए \b का उपयोग नहीं कर सकते हैं।

क्या आप के बजाय कर सकता है इस का उपयोग करने के लिए है:

"αβ αβγ γαβ αβ αβ".replace(/(^|\s)αβ(?=\s|$)/g, "$1AB") 
+0

धन्यवाद। लुकहेड (? = ...) नोटेशन का उपयोग दिलचस्प भी दिखता है। क्या यह इसके बिना किया जा सकता है? – cherouvim

+3

@cherouvim: नहीं, यह उस शब्द के बाद अंतरिक्ष का उपभोग करेगा जो अगले लुकअप के लिए शुरू होता है।तो बस 'αβ αβ "' को देखकर, पहला मैच 'αβ | αβ" '(' | 'आंतरिक सूचक इंगित करता है) का उपभोग करेगा और अंतिम भाग मिलान नहीं किया जाएगा क्योंकि कोई अग्रणी स्थान शेष नहीं है। लेकिन चूंकि आगे के विचारों में वर्णों का उपभोग नहीं होता है, इसलिए पहले मैच के बाद सूचक की स्थिति 'αβ | αβ" होगी और अगली मैच के लिए अग्रणी स्थान संरक्षित किया जाएगा। – Gumbo

+1

यह शब्द सीमा के समान नहीं है। उदाहरण के लिए यह 'αβ! 'से मेल नहीं खाता है। –

1

नहीं सभी RegEx के कार्यान्वयन जावास्क्रिप्ट इंजन एक यूनिकोड बारे में पता के साथ जुड़े।

उदाहरण के लिए आईई में उपयोग कर माइक्रोस्कोफ्ट जेस्क्रिप्ट एएनएसआई तक सीमित है।

2

नहीं सभी जावास्क्रिप्ट regexp कार्यान्वयन यूनिकोड विज्ञापन के लिए समर्थन हासिल है, तो आप इसे

"αβ αβγ γαβ αβ αβ".replace(/\u03b1\u03b2/g, "AB"); // "AB ABγ γAB AB AB" 

से बचने के लिए वर्ण मैपिंग करने के लिए http://htmlhelp.com/reference/html40/entities/symbols.html

बेशक पर एक नज़र ले जा सकते हैं, इस मदद नहीं करता है की जरूरत है शब्द सीमा मुद्दे (जैसा कि अन्य उत्तरों में बताया गया है) के साथ कम से कम आपको वर्णों को ठीक से मिलान करने में सक्षम होना चाहिए

+0

फिर आप स्ट्रिंग के लिए उसी यूनिकोड एस्केप का उपयोग क्यों नहीं करते? – Gumbo

+0

क्योंकि किसी को एक स्ट्रिंग के रूप में पार्स किया जाता है, और एक शाब्दिक RegExp के रूप में - मुझे यकीन नहीं है कि यह महत्वपूर्ण है .. –

+3

लेकिन यदि नियमित अभिव्यक्ति कार्यान्वयन यूनिकोड का समर्थन नहीं करता है, तो यूनिकोड से बचने का अनुक्रम '\ u03b1' व्याख्या की जानी चाहिए? – Gumbo

1

जब आप यूनिकोड और प्राकृतिक भाषा वाले शब्दों से निपट रहे हैं, तो शायद आप अधिक सावधान रहना चाहते हैं \b का उपयोग करने की तुलना में ith सीमाएं। विवरण और दिशानिर्देशों के लिए this answer देखें।

2

मैं क्यों मैं इस पृष्ठ और यह भी पाया है प्रोग्राम हो सकता है और विराम चिह्न, कोष्ठक, आदि

http://jsfiddle.net/AQvyd/

var wordToReplace = '買い手', 
    replacementWord = '[[BUYER]]', 
    text = 'Mange 買い手 information. The selected Store and Classification will be the default on the สั่งซื้อ.' 

function replaceWord(text, wordToReplace, replacementWord) { 
    var re = new RegExp('(^|\\s|\\(|\'|"|,|;)' + wordToReplace + '($|\\s|\\)|\\.|\'|"|!|,|;|\\?)', 'gi'); 
    return text.replace(re, replacementWord); 
} 

मैं एक जावास्क्रिप्ट संसाधन संपादक लिखा है संभाल करने के लिए तो यह है कुछ की जरूरत इसकी आवश्यकता से जवाब दिया क्योंकि मुझे एक शब्द सीमा पैरामीटरेटेड रेगेक्सप नहीं मिला जो यूनिकोड के लिए अच्छा काम करता था।

+0

असल में, मुझे आरक्षित पात्रों में "\" के साथ "wordToReplace" से बच जाना चाहिए। मुझे इसे अपडेट करना होगा। –

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