2011-05-24 21 views
5

का उपयोग करके उद्धरण के बाहर सफेद जगह बदलें C# का उपयोग करके, मुझे% वर्ण के साथ उद्धरण के बाहर सभी व्हाइटस्पेस को प्रतिस्थापित करके LIKE कमांड का उपयोग करके SQL सर्वर डेटाबेस में खोज के लिए एक खोज टेक्स्ट तैयार करने की आवश्यकता है। उदाहरण:नियमित अभिव्यक्ति

इनपुट:

my "search text" 

आउटपुट:

%my%search text% 

किसी भी मदद की सराहना की जाएगी। मैं पाठ को बदलने से पहले उद्धरणों की एक विषम संख्या के साथ इनपुट तारों को संभाल सकता हूं।

उत्तर

6

आप एक regex का उपयोग करने के है, तो आप यह कर सकते हैं अगर आप यह सुनिश्चित करें कि सभी उद्धरण सही ढंग से संतुलित हैं, और कोई स्ट्रिंग में उद्धरण (\") भाग निकले देखते हैं अगर कर रहे हैं (यह उन के लिए खाते के लिए संभव है , भी, लेकिन यह regex और भी जटिल बनाता है)।

resultString = Regex.Replace(subjectString, 
    @"[\ ]  # Match a space (brackets for legibility) 
    (?=   # Assert that the string after the current position matches... 
    [^""]*  # any non-quote characters 
    (?:   # followed by... 
     ""[^""]* # one quote, followed by 0+ non-quotes 
     ""[^""]* # a second quote and 0+ non-quotes 
    )*   # any number of times, ensuring an even number of quotes 
    $   # until the end of the string 
    )   # End of lookahead", 
    "%", RegexOptions.IgnorePatternWhitespace); 

यह वर्तमान अंतरिक्ष चरित्र के बाद उद्धरण के सम संख्या का दावा करने की स्ट्रिंग के शेष जांच करता है। लुकहेड का लाभ (धन्यवाद एलन मूर!) यह है कि यह दिखने से अधिक पोर्टेबल है (.NET को छोड़कर अधिकांश रेगेक्स स्वाद और कुछ अन्य लोग दृढ़ विश्वास के अंदर अनिश्चित पुनरावृत्ति का समर्थन नहीं करते हैं)। यह भी तेजी से हो सकता है।

मूल समाधान lookbehind से जुड़े इस प्रकार है:

resultString = Regex.Replace(subjectString, 
    @"(?<=  # Assert that the string up to the current position matches... 
    ^   # from the start of the string 
    [^""]*  # any non-quote characters 
    (?:   # followed by... 
     ""[^""]* # one quote, followed by 0+ non-quotes 
     ""[^""]* # a second quote and 0+ non-quotes 
    )*   # any number of times, ensuring an even number of quotes 
    )   # End of lookbehind 
    [ ]   # Match a space (brackets for legibility)", 
    "%", RegexOptions.IgnorePatternWhitespace); 
+0

@ एंड्रियास: अच्छी पसंद। आपको ओडेड के उत्तर को स्वीकार करना चाहिए, फिर (उसके बगल में स्थित चेकमार्क पर क्लिक करें)। –

10

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

+0

धन्यवाद, यह जाहिरा तौर पर regex दृष्टिकोण की तुलना में बहुत आसान था। मुझे अभी भी लगातार कई सफेद रिक्त स्थान एक% के साथ बदलना पड़ा था, लेकिन यह बहुत मुश्किल नहीं है (मैंने रेगेक्स का उपयोग करके वह हिस्सा किया था)। – Andreas

0

दोहरे उद्धरण चिह्नों कुछ फैशन में भाग निकले नहीं हैं, तो उसके बाद निम्न एक और संभावना है। शायद कुछ तरीकों के रूप में कुशल नहीं है (और निश्चित रूप से टिम के रेगेक्स के रूप में ठंडा नहीं है), लेकिन जब अगला व्यक्ति कोड को देखता है तो यह उचित रूप से समझ में आता है। यह स्ट्रिंग को डबल कोट्स पर विभाजित करता है और फिर मानों के माध्यम से loops। विषम प्रविष्टियां उद्धरण के बाहर के हिस्सों हैं, यहां तक ​​कि प्रवेश उद्धरण के अंदर भी हैं।

string value = "\"first\" some text \"other in quotes\" out of them \"in them\""; 
    string[] sets = value.Split('\"'); 
    StringBuilder newvalue = new StringBuilder("%"); 
    for (int i = 0; i < sets.Length; i++) { 
    if (i % 2 == 0) 
     // even ones are outside quotes 
     newvalue.Append(sets[i].Replace(' ', '%')); 
    else 
     // and the odd ones are in quotes 
     newvalue.Append("\"" + sets[i] + "\""); 
    } 

    // final % 
    newvalue.Append("%"); 
0

ऐसा लगता है कि आप भी उद्धरण चिह्नों को हटाने और शुरुआत और खोज स्ट्रिंग के अंत में एक % जोड़ना चाहते हैं की तरह। इस प्रयास करें:

string s0 = @"my ""search text"""; 

Regex re = new Regex(@"(?x) 
    (?: 
     (?<term>[^\s""]+) 
    | 
     ""(?<term>[^""]+)"" 
    ) 
    (?:\s+|$)"); 

string s1 = @"%" + re.Replace(s0, @"${term}%"); 
Console.WriteLine(s1); 

उत्पादन:

%my%search text% 
0

कुछ इस तरह करते:

private static string RemoveUnquotedWhiteSpaces(string text) 
{  
    string result = String.Empty; 
    var parts = text.Split('"'); 
    for(int i = 0; i < parts.Length; i++) 
    { 
     if (i % 2 == 0) result += Regex.Replace(parts[i], " ", ""); 
     else result += String.Format("\"{0}\"", parts[i]); 
    } 
    return result 
    } 
संबंधित मुद्दे