2016-02-24 4 views
6

नमूना स्ट्रिंगRegex केवल संख्याओं वाले वर्ग कोष्ठक मिलता है लेकिन इस वर्गाकार कोष्ठक में नहीं हैं खुद को

"[] [ds*[000112]] [1448472995] sample string [1448472995] ***"; 

regex

[1448472995] [1448472995] 

से मेल खाना चाहिए और [000112] मेल नहीं खाना चाहिए क्योंकि वहाँ बाहरी वर्ग है ब्रैकेट।

वर्तमान में मैं इस regex कि [000112] रूप में अच्छी तरह

const string unixTimeStampPattern = @"\[([0-9]+)]"; 
+0

दूसरे शब्दों में, आप केवल एक ब्रैकेट किए गए नंबर से मेल खाना चाहते हैं यदि समान संख्या (संतुलित) खोलने और बंद करने वाले ब्रैकेट का पालन करें? –

+0

नेस्टेड ब्रैकेट को बाहर करने के लिए आपको संतुलित टेक्स्ट रेगेक्स का उपयोग करना होगा। – sln

+1

@ टिम: हाँ आप सही हैं। – Sameer

उत्तर

4

यह संतुलित पाठ का उपयोग कर यह करने के लिए एक अच्छा तरीका है।

(\[ \d+ \])     # (1) 
|        # or, 
    \[       # Opening bracket 
    (?>       # Then either match (possessively): 
     [^\[\]]+      # non - brackets 
     |        # or 
     \[       # [ increase the bracket counter 
     (?<Depth>) 
     |        # or 
     \]       # ] decrease the bracket counter 
     (?<-Depth>) 
    )*       # Repeat as needed. 
    (?(Depth)      # Assert that the bracket counter is at zero 
     (?!) 
    ) 
    \]       # Closing bracket 

सी # नमूना

string sTestSample = "[] [ds*[000112]] [1448472995] sample string [1448472995] ***"; 
Regex RxBracket = new Regex(@"(\[\d+\])|\[(?>[^\[\]]+|\[(?<Depth>)|\](?<-Depth>))*(?(Depth)(?!))\]"); 

Match bracketMatch = RxBracket.Match(sTestSample); 
while (bracketMatch.Success) 
{ 
    if (bracketMatch.Groups[1].Success) 
     Console.WriteLine("{0}", bracketMatch); 
    bracketMatch = bracketMatch.NextMatch(); 
} 

आउटपुट

[1448472995] 
[1448472995] 
+0

यह टिम के सोलन की तुलना में बहुत अधिक प्रदर्शनकारी है। धन्यवाद!!! – Sameer

-2

मिलान अपेक्षा के अनुसार यह आपकी अभिव्यक्ति से मेल खाएगी है: http://regexr.com/3csg3 यह अग्रदर्शी उपयोग करता है।

+2

सबसे पहले, कृपया उन उत्तरों को पोस्ट न करें जो केवल बाहरी साइटों से लिंक हों। दूसरा, जैसे ही दूसरा समापन संश्लेषण तुरंत पहले का पालन नहीं करता है, जैसे कि [[foo [1234] बार] 'में आपका रेगेक्स विफल रहता है। –

4

आप इस संभाल करने balancing groups उपयोग करने की आवश्यकता - यह थोड़ा कठिन दिखता है, लेकिन यह सब जटिल नहीं है:

Regex regexObj = new Regex(
    @"\[    # Match opening bracket. 
    \d+    # Match a number. 
    \]     # Match closing bracket. 
    (?=    # Assert that the following can be matched ahead: 
    (?>    # The following group (made atomic to avoid backtracking): 
     [^\[\]]+   # One or more characters except brackets 
    |     # or 
     \[ (?<Depth>) # an opening bracket (increase bracket counter) 
    |     # or 
     \] (?<-Depth>) # a closing bracket (decrease bracket counter, can't go below 0). 
    )*    # Repeat ad libitum. 
    (?(Depth)(?!)) # Assert that the bracket counter is now zero. 
    [^\[\]]*   # Match any remaining non-bracket characters 
    \z    # until the end of the string. 
    )     # End of lookahead.", 
    RegexOptions.IgnorePatternWhitespace); 
+1

यह एक निषिद्ध रूप से लंबा समय लगता है जब यह हर बार '[\ d +]' के पीछे ब्रैकेट को मान्य करता है। आप टेस्ट स्ट्रिंग की प्रतियों को कैट करके इसका परीक्षण कर सकते हैं। मैंने 2000 प्रतियां की, 5 मिनट इंतजार किया, यह कभी वापस नहीं आया। मेरा 1 सेकंड में वापस आया। समय से पहले अलग-अलग स्ट्रिंग पर संतुलित ब्रैकेट को सत्यापित करना शायद तेज़ है। फिर एक साधारण विकल्प करें। – sln

+0

@ टिम: धन्यवाद !!! वह सहायक था। मैं पार्सिंग तर्क से निपटने की कोशिश कर रहा हूं :)। मुझे मैच के समूह के रूप में एक मैच और नंबर में स्क्वायर ब्रैकेट प्राप्त करने की आवश्यकता है, क्योंकि मेरा मैच यूनिक्सटाइम से व्युत्पन्न डेटटाइम द्वारा प्रतिस्थापित किया जाना चाहिए। मैं ओपनिंग ब्रैकेट से बस (? <= \ [) को इस जगह से बदलकर मिलान कर सकता हूं लेकिन यह पता नहीं लगा सकता कि बंद ब्रैसेट से कैसे मिलान किया जाए। – Sameer

0

तुम सिर्फ यूनिक्स समय स्टाम्प पर कब्जा करने की कोशिश कर रहे हैं? फिर आप एक सरल कोशिश कर सकते हैं जहां आप समूह में मिलान किए गए वर्णों की न्यूनतम संख्या निर्दिष्ट करते हैं।

\[([0-9]{10})\] 

यहाँ मैं 10 अक्षर तक सीमित के बाद से मुझे शक समय स्टाम्प कभी भी जल्द ही 11 अक्षर मारा जाएगा ... कि के खिलाफ की रक्षा करने के लिए:

\[([0-9]{10,11})\] 

बेशक इस झूठे सकारात्मक है, तो करने के लिए ले जा सकता है आपके पास एक संलग्न ब्रैकेट में 10-लंबाई की संख्या है।

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