2008-08-28 12 views
13

Sourceरेगेक्स केस असंवेदनशीलता धीमी है?

RegexOptions.IgnoreCase अधिक महंगी की तुलना में मैं सोचा होगा है (जैसे, मुश्किल से औसत दर्जे का होना चाहिए)

यह मानते हुए कि इस रूप में अच्छी तरह PHP, Python, Perl, Ruby आदि पर लागू होता है के रूप में सी # (जो मुझे लगता है कि जेफ का उपयोग कर रहा था), कितना मंदी है और क्या मुझे /[a-zA-z]/ के साथ एक समान दंड मिलेगा क्योंकि मैं /[a-z]/i के साथ होगा?

+0

@Brian Warshaw: '[एक-z]' कुछ और कार्य शामिल हैं:

>>> ''.join([ chr(c) for c in range(ord('A'), ord('z')+1)]) 'ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_'abcdefghijklmnopqrstuvwxyz'

उत्तर

13

हां, [ए-ज़ा-जेड] RegexOptions.IgnoreCase को सेट करने से काफी तेज होगा, मुख्य रूप से यूनिकोड तारों के कारण। लेकिन यह भी अधिक सीमित है - [ए-ज़ा-जेड] मिलान वाले अंतरराष्ट्रीय पात्रों से मेल खाता है, यह सचमुच ए-ज़ा-जेड एएससीआईआई सेट है और कुछ और नहीं है।

यदि आप मेरा संदेश के लिए टिम ब्रे के जवाब देखा मुझे पता नहीं है, लेकिन यह एक अच्छा एक है:

अंतर्राष्ट्रीय खोज में trickiest मुद्दों में से एक अपर और लोअर केस है। मामले की यह धारणा लैटिन, यूनानी और सिरिलिक चरित्र सेट में लिखी गई भाषाओं तक ही सीमित है। अंग्रेजी-स्पीकर स्वाभाविक रूप से खोज को असंवेदनशील होने की उम्मीद करते हैं, क्योंकि केवल इसलिए कि वे आलसी हैं: यदि नादिया जोन्स Google पर खुद को देखना चाहते हैं तो शायद वह सिर्फ नाडिया जोन्स में टाइप करेंगी और सिस्टम की देखभाल करने की उम्मीद करेगी।

तो यह खोज प्रणालियों के लिए इंडेक्सिंग और प्रश्नों के लिए सभी को कम या ऊपरी मामले में परिवर्तित करके शब्दों को "सामान्यीकृत" करने के लिए काफी आम है।

समस्या यह है कि मामलों के बीच मैपिंग हमेशा अंग्रेजी में जितनी सीधी नहीं होती है। उदाहरण के लिए, जर्मन लोअर-केस कैरेक्टर "ß" ऊपरी-चरणबद्ध होने पर "एसएस" बन जाता है, और अच्छी पुरानी पूंजी "मैं" जब तुर्की में डाउन-कैस डॉटलेस "ı" बन जाती है (हाँ, उनके पास "i" है, ऊपरी केस संस्करण "İ" है)। मैंने पढ़ा है (लेकिन पहले हाथ की पुष्टि नहीं की है) कि फ्रांस और क्यूबेक में उच्चारण किए गए अक्षरों जैसे "é" को अपनाने के नियम अलग हैं। इन सबके परिणामों में से एक यह है कि java.String.toLowerCase() जैसे सॉफ़्टवेयर आश्चर्यजनक रूप से धीमे चलते हैं क्योंकि यह इन सभी कोने-मामलों के आसपास काम करने की कोशिश करता है।

http://www.tbray.org/ongoing/When/200x/2003/10/11/SearchI18n

1

आप संख्या होने बर्दाश्त और कहा कि regex में रेखांकित कर सकते हैं, तो आप कर सकते हैं जैसे कि \ डब्ल्यू संशोधक (पर्ल वाक्यविन्यास) का उपयोग करें। मेरा मानना ​​है कि कुछ इंजन समर्थन करते हैं [: अल्फा:], लेकिन यह शुद्ध पर्ल नहीं है। \ w उस लोकेल को ध्यान में रखता है जिसमें आप हैं, और दोनों अपरकेस और लोअरकेस से मेल खाते हैं, और मुझे लगता है कि मामले को अनदेखा करते समय यह [ए-जेड] का उपयोग करने से तेज़ है।

0

यदि आप इसके बारे में चिंतित हैं, तो यह जांचने से पहले केस को सभी ऊपरी या सभी निचले स्तर पर सेट करना उचित हो सकता है।
उदाहरण के लिए, पर्ल में:

$x = "abbCCDGBAdgfabv"; 
(lc $x) =~ /bad/; 

मई कुछ मामलों में हो सकता है की तुलना में बेहतर

$x = "abbCCDGBAdgfabv"; 
$x =~ /bad/i; 
संबंधित मुद्दे