2012-10-04 13 views
7

मैं sp { ...{...}... } जैसे टेक्स्ट से मिलान करने की कोशिश कर रहा हूं, जहां घुंघराले ब्रेसिज़ को घोंसला करने की अनुमति है। sp { { word } }:नेस्टेड ब्रेसिज़ से मेल खाने के लिए रिकर्सिव अभिव्यक्ति के साथ रेगेक्स?

my $regex = qr/ 
(     #save $1 
    sp\s+   #start Soar production 
    (    #save $2 
     \{   #opening brace 
     [^{}]*  #anything but braces 
     \}   #closing brace 
     | (?1)  #or nested braces 
    )+    #0 or more 
) 
/x; 

मैं सिर्फ यह निम्न पाठ मिलान करने के लिए नहीं मिल सकता है: यह क्या मैं अब तक है। क्या कोई देख सकता है कि मेरे रेगेक्स में क्या गलत है?

उत्तर

6

कई समस्याएं हैं। पुनरावर्ती सा होना चाहिए:

(
    (?: \{ (?-1) \} 
    | [^{}]+ 
    )* 
) 

सभी एक साथ:

my $regex = qr/ 
    sp\s+ 
    \{ 
     (
     (?: \{ (?-1) \} 
     | [^{}]++ 
     )* 
    ) 
    \} 
/x; 

print "$1\n" if 'sp { { word } }' =~ /($regex)/; 
+0

बस मुझे जो चाहिए था। –

+0

जैसा कि मैं कह सकता हूं, रेगेक्स ब्रेसिज़ के चारों ओर रिक्त स्थान (कविता के लिए खेद है) की अनुमति नहीं देता है, इसलिए परीक्षण केस विफल होना चाहिए। उसके साथ क्या है? – tripleee

+0

हमम ... यह कुछ आंशिक मैचों के लिए हमेशा के लिए ले रहा है, जैसे: 'sp {word { –

5

यह underused Text::Balanced, बात इस तरह का के लिए एक बहुत आसान कोर मॉड्यूल के लिए मामला है। यह पाया जा रहा है/पहले सेट सीमांकित अनुक्रम की शुरुआत की pos पर भरोसा करता है, तो मैं आम तौर पर इस तरह यह आह्वान:

#!/usr/bin/env perl 

use strict; 
use warnings; 

use Text::Balanced 'extract_bracketed'; 

sub get_bracketed { 
    my $str = shift; 

    # seek to beginning of bracket 
    return undef unless $str =~ /(sp\s+)(?={)/gc; 

    # store the prefix 
    my $prefix = $1; 

    # get everything from the start brace to the matching end brace 
    my ($bracketed) = extract_bracketed($str, '{}'); 

    # no closing brace found 
    return undef unless $bracketed; 

    # return the whole match 
    return $prefix . $bracketed; 
} 

my $str = 'sp { { word } }'; 

print get_bracketed $str; 

gc संशोधक के साथ regex स्ट्रिंग बताता है याद करने के लिए जहां का अंतिम बिंदु मैच है, और extract_bracketed उस जानकारी का उपयोग यह जानने के लिए करता है कि कहां से शुरू करना है।

+0

मुझे वास्तव में इस मॉड्यूल पर पढ़ने की जरूरत है। यह बहुत कुछ आता है, लेकिन मैं हमेशा रेगेक्स पसंद करता हूं क्योंकि मैंने इसे सीखने में इतना समय पहले निवेश किया है, और अधिक सीखना मजेदार है, और अधिक कॉम्पैक्ट लगता है। जवाब के लिए धन्यवाद! –

+0

@NateGlenn, यह वास्तव में regexp और विशेष रूप से regexp 'gc' (पार्सर) कार्यक्षमता के पूरक है। यही कारण है कि यह स्ट्रिंग के 'pos' का उपयोग करता है, क्योंकि यह अपेक्षा की जाती है कि आप '// gc' के साथ' text_balanced' पर कॉल को अंतःस्थापित करेंगे –

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

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