2011-05-27 10 views
6

मैं वर्तमान में एक परियोजना को देख रहा हूं जो नियमित अभिव्यक्तियों का अत्यधिक उपयोग करता है। इनपुट स्ट्रिंग पहले से ही ऊपरी चरणबद्ध हैं और इसलिए regex IgnoreCase ध्वज सेट किया गया है। आंतरिक एमएस रेगेक्स इंजन हालांकि सभी मामलों को वापस कम कर रहा है जो एक अनावश्यक हिट है। रेग एक्सप्रेसन पैटर्न को ऊपरी मामले में बदलना और ध्वज को हटाने से प्रदर्शन में मदद मिलती है।एक नियमित अभिव्यक्ति पैटर्न के ऊपरी मामले कैसे करें?

क्या किसी को एल्गोरिदम की लाइब्रेरी के बारे में पता है जो समूह के नामों या भागने वाले वर्णों को प्रभावित किए बिना रेग पूर्व पैटर्न को ऊपरी मामला कर सकता है?

+0

कर सकते हो अपने पैटर्न स्ट्रिंग पर '[^ AZ]' – diEcho

+0

'ToUpper() 'का उपयोग करें। यह विशेष वर्णों को प्रभावित नहीं करना चाहिए। – RBaarda

+2

मुझे डर है कि यह कर सकता है, उदाहरण के लिए \ w या \ s का अलग अर्थ है जब ToUpper() - ed – petho

उत्तर

1

आप जा सकते हैं और छोटे अक्षरों कि बैकस्लैश का एक असमान संख्या से पहले नहीं कर रहे हैं के लिए खोज:

(?<!(?<!\\)(?:\\\\)*\\)\p{Ll}+ 

फिर एक MatchEvaluator को मैच गुजरती हैं, यह अपरकेस और मूल स्ट्रिंग में पाठ बदलने। मैं सी # पता नहीं है, तो यह सही दूर काम नहीं कर सकते (कोड स्निपेट लिया और RegexBuddy से थोड़ा संशोधित), लेकिन यह एक शुरुआत है:

string resultString = null; 
resultString = Regex.Replace(subjectString, 
    @"(?<!     # Negative lookbehind: 
     (?<!\\)(?:\\\\)*\\ # Is there no odd number of backslashes 
     |     # nor 
     \(\?<?\p{L}*  # (?<tags or (?modifiers 
    )     # before the current position? 
     \p{Ll}+    # Then match one or more letters", 
    new MatchEvaluator(ComputeReplacement), RegexOptions.IgnorePatternWhitespace); 

public String ComputeReplacement(Match m) { 
    // You can vary the replacement text for each match on-the-fly 
    return @"\0".ToUpper(); // or whatever is needed for uppercasing in .NET 
} 

स्पष्टीकरण:

(?<!  # assert that the string before the current position doesn't match: 
(?<!\\) # assert that we start at the first backslash in the series 
(?:\\\\)* # match an even number of backslashes 
\\   # match one backslash 
) 
\p{Ll}+  # now match any sequence of lowercase letters 
+0

को बदलकर प्राप्त परिणामों के मुकाबले इनकी तुलना करने में सक्षम हूं एक और बात: यह रेगेक्स '(? एस)' जैसे जगह-जगह संशोधकों को बदल देगा, और मुझे संदेह है कि '(? एस)' नहीं जा रहा है सही ढंग से काम करें। तो यदि आपके पास अपने regexes में हैं, तो इस दृष्टिकोण को बदलने की आवश्यकता हो सकती है। यह यूनिकोड गुणों जैसे '\ p {Ll}' के साथ अवांछित परिणाम भी उत्पन्न करेगा ... –

+0

क्या यह किसी भी समूह के नाम के ऊपरी मामले में नहीं होगा? मुझे एक बाधा है कि में मौजूद किसी मौजूदा समूह के नाम को पहले से ही सेट किए गए उसी मामले में रहना होगा। – gouldos

+0

हां, यह होगा। हालांकि, इसके लिए जिम्मेदार होना संभव होना चाहिए। एक सेकंड रुको; मैं अपना जवाब संपादित करूंगा। –

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