2010-10-21 24 views
5

के साथ एक स्ट्रिंग में बिल्कुल एक मौका मिलान करना दूसरे दिन मैं एक नियमित अभिव्यक्ति समस्या के साथ बैठ गया। आखिरकार मैंने नियमित अभिव्यक्तियों के बिना इसे अलग तरीके से हल किया, लेकिन मैं अभी भी यह जानना चाहूंगा कि आप इसे कैसे करते हैं :)एक नियमित अभिव्यक्ति

समस्या जो मैं कर रहा था वह एक स्वचालित स्क्रिप्ट के माध्यम से svn अद्यतन चला रहा था, और मैं संघर्षों का पता लगाना चाहता था। इसे या साथ में रेगेक्स के साथ करना बहुत छोटा है, लेकिन यह मुझे एक और अस्पष्ट समस्या के बारे में सोचने लगा: आप व्हाइटस्पेस के एक निश्चित लंबाई क्षेत्र के अंदर एक चरित्र के बिल्कुल एक मौके से कैसे मेल खाते हैं?

 
"C  " MATCH 
" C " MATCH 
" C C " NO MATCH 
" M " NO MATCH 
"  " NO MATCH 
"C  " NO MATCH (7 characters, not 6) 
" C " NO MATCH (5 characters, not 6) 

उत्तर

6

मैं जानता हूँ कि यह अपने खुद के सवाल का जवाब देने का अधिकार नहीं है, लेकिन मैं मूल रूप से अपने जवाब में विलय कर दिया ... :) लौ नहीं है कृपया

^(?=.{6}$) *C *$

संपादित करें: की जगह। नीचे Tomalak की प्रतिक्रिया के साथ [C] लगभग 4-5% के साथ गति बढ़ जाती है या तो

^(?=[ C]{6}$) *C *$

+0

+1 हाँ, यह भी अच्छा है। अंतिम '$' अभी भी अनावश्यक है, मेरा नोट # 2 देखें। * (और नहीं, आपके अपने प्रश्न का उत्तर देने में कोई गलती नहीं है। फ्लेम होने का कोई खतरा नहीं है।) * – Tomalak

+0

@ टोमलाक अगर मैं अंतिम $ को हटा देता हूं, तो यह विफल रहता है जब सी के बाद सी के अलावा कुछ और भी चालू होता है सी – KennethJ

+0

के कई अवसरों को प्रारंभिक रूप से आगे के लिए मेरे बदले गए उत्तर को देखें जो इसे ठीक करता है। – Tomalak

5
^(?=[ C]{6}$) *C(?! *C) 

स्पष्टीकरण::

 
^    # start-of-string 
(?=[ C]{6}$) # followed by exactly 6 times " " or "C" and the end-of-string 
*C   # any number of spaces and a "C" 
(?! *C)  # not followed by another C anywhere (negative lookahead) 

नोट्स:

    उदाहरण के लिए, मान लीजिए कि हम एक छह बाइट व्यापक क्षेत्र के अंदर 'सी' मैच के लिए चाहता था चलो

  • ^(?=…{6}$) निर्माण कहीं भी इस्तेमाल किया जा सकता है स्ट्रिंग लंबाई मापने के लिए लेकिन वास्तव में कुछ भी मैच नहीं है।
  • चूंकि स्ट्रिंग के अंत को पहले से ही आगे देखा गया है, इसलिए आपको रेगेक्स के अंत में $ डालने की आवश्यकता नहीं है, लेकिन ऐसा करने से कोई दिक्कत नहीं होती है।
+0

यह नहीं होना चाहिए^सी, उपयोगकर्ता एक सफेद स्थान के लिए कहा। – testalino

+0

@testalino: अच्छा बिंदु। यह चीजों को आसान बनाता है, यहां तक ​​कि। – Tomalak

+0

+1 लुकहेड, दिलचस्प उदाहरण के भयानक उपयोग के लिए +1। हालांकि, मैच सी के दो मौकों पर विफल रहता है, यह इसे ठीक करता है:^(? =। {6} $) [^ सी] *? सी (?! * * सी) – KennethJ

4
^[^C]*C[^C]*$ 

लेकिन यह अपने स्ट्रिंग की लंबाई को सत्यापित नहीं होंगे।

+1

+1 नकारात्मक चरित्र वर्ग मेरे लुकहेड से बेहतर हैं। – Tomalak

+0

कैरेक्टर क्लासेस बेहतर हैं। लेकिन यह कुल लंबाई को ध्यान में नहीं लेता है। तो आपको कुछ ऐसा करने की आवश्यकता होगी: '^ (सी [^ सी] {5} | [^ सी] सी [^ सी] {4} | [^ सी] {2} सी [^ सी] {3} | [^ सी] {3} सी [^ सी] {2} | [^ सी] {4} सी [^ सी] | [^ सी] {5} सी) $ ' – Gumbo

+0

... लेकिन दुर्भाग्यवश, दूसरी आवश्यकता के साथ (केवल रिक्त स्थान) यह अब और काम नहीं करता है। मेरे जवाब पर @ testalino की टिप्पणी देखें। – Tomalak

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