2011-12-12 15 views
5

मैं निम्नलिखित स्ट्रिंग है:पर्ल विभाजन और नियमित अभिव्यक्ति

'100% California Grown Olives, Water, Salt And Ferrous Gluconate (An,Iron, Derivative),asasd, sadasda' 

मैं /,/ द्वारा इसे विभाजित करना लेकिन केवल तभी अपनी नहीं अंदर कोष्ठक, उदाहरण के लिए, इस मामले में परिणाम होना चाहिए कोशिश कर रहा हूँ :

100% California Grown Olives 
Water 
Salt And Ferrous Gluconate (An,Iron, Derivative) 
asasd 
sadasda 

धन्यवाद,

+1

क्या नेस्टेड कोष्ठक की संभावना है? यदि ऐसा है, तो Regexes बिल फिट नहीं हो सकता है। –

+1

नहीं, संभव नहीं है। केवल एक जोड़ी कोष्ठक, या जोड़े लेकिन – snoofkin

उत्तर

11
@result = split(m/,(?![^()]*\))/, $subject); 

टी उसके बाद एक अल्पविराम पर विभाजन होता है यदि अगले अनुवर्ती संश्लेषण (यदि कोई है) एक समापन संश्लेषण नहीं है। जैसे जैक मैनी ने सही ढंग से उल्लेख किया है, अगर नेस्टेड कोष्ठक हो सकते हैं तो इससे विफलता हो सकती है।

स्पष्टीकरण:

,  # Match a comma. 
(?!  # Assert that it's impossible to match... 
[^()]* # any number of non-parenthesis characters 
\)  # followed by a closing parenthesis 
)  # End of lookahead assertion 
1

सबसे पहले आप क्या कोष्ठक का गठन किया यह निर्णय लेना होगा, और वे नेस्ट किया जा सकता है। (इस उत्तर के लिए, मुझे लगता है कि वे हो सकते हैं)।

my @parens; 
$str =~ s/(\((?: (?0)|[^()])* \))/push @parens, $1; "PARENS_$#parens"/gex; 

तो अब आप कुछ है कि तरह लग रहा है के साथ छोड़ दिया जाता है: तो फिर तुम पाठ से उन कोष्ठक ब्लॉक को हटाने और एक प्लेसहोल्डर के साथ बदलने की जरूरत है

'100% California Grown Olives, Water, Salt And Ferrous Gluconate PAREN_0,asasd, 
sadasdas.' 

और यह अब आसान विभाजित करने के लिए है यह अल्पविराम पर। फिर प्रत्येक विभाजित टुकड़ों पर, PAREN_\d+ टोकन के लिए स्कैन करें, और @parens सरणी से उन्हें बदलें। आपको अपनी स्रोत सामग्री के आधार पर एक और अद्वितीय प्लेसहोल्डर नाम का उपयोग करने की आवश्यकता हो सकती है।

कुछ की तरह:

s/PARENS_(\d+)/$parens[$1]/ge for my @segs = split /,\s*/ => $str; 

say for @segs; 

जो एक उदाहरण स्ट्रिंग के लिए:

my $str = "foo (b,a,r), baz (foo, (bar), baz), biz"; 

प्रिंट:

foo (b,a,r) 
baz (foo, (bar), baz) 
biz 
+0

घोंसला नहीं है मुझे नहीं लगता कि आपको '$ parens [$ 1]' का मूल्यांकन करने की आवश्यकता है। – TLP

0

आप यह आसान आप जो चाहते हैं के लिए एक regexp निर्माण करने के लिए मिल सकती है मैच, जो आप निकालना चाहते हैं उसके बजाए। (यह मानता है कि आप मैचों की संख्या को सीमित नहीं करना चाहते हैं।)

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