2010-02-12 17 views
6

में माता-पिता नहीं, ठीक है, मुझे एक अजीब बात है कि मैं थोड़ी देर के लिए जामिंग कर रहा हूं (तला हुआ दोपहर का मन मुझे लगता है कि काम नहीं करता है)।पैरों के अंदर पाठ को हटा रहा है, लेकिन पर्ल

क्या कोई स्ट्रिंग को पार्स करने के लिए दूर से जानता है और माता-पिता को हटाए बिना माता-पिता के अंदर सभी पाठ हटा देता है ... लेकिन अंदर पाए गए माता-पिता को हटाने के साथ।

यानी।

myString = "this is my string (though (I) need (help) fixing it)" 

जो मैं चाहता यह कैसा दिखेगा के माध्यम से चलाने के बाद:

myString = "this is my string()" 

बहुत उन दो कोष्ठक वहाँ रखने के लिए महत्वपूर्ण है।

उत्तर

2

आप Regexp का उपयोग कर :: आम बिना रेगुलर एक्सप्रेशन उपयोग करना चाहते हैं। "चारों ओर देखो" फ़ीचर देखें। इसे पर्ल 5. के साथ पेश किया गया था। आप regular-expressions.info पर "आगे देखो" और "पीछे देखो" के बारे में अधिक पढ़ सकते हैं। "मास्टरिंग नियमित अभिव्यक्तियों" पुस्तक में "चारों ओर देखो" पर एक अनुभाग भी है। पेज 59 पर देखें।

#!/usr/bin/env perl 

use Modern::Perl; 

my $string = 'this is my (string (that)) I (need help fixing)'; 

$string =~ s/(?<=\()[^)]+[^(]+(?=\))//g; 

say $string; 
6

आपको कैप्चर समूह शुरू करने से रोकने के लिए कोष्ठक से बचने की आवश्यकता है। पैटर्न \(.+\)( से शुरू होने वाली सबसे लंबी सबस्ट्रिंग से मेल खाता है और ) के साथ समाप्त होता है। यह किसी भी हस्तक्षेप करने वाले कोष्ठक सहित अंतिम ) तक सबकुछ ऊपर ले जाएगा। कोष्ठकों के 1 से अधिक शीर्ष स्तर के साथ

#!/usr/bin/perl 

use strict; use warnings; 

my $s = "this is my string (though (I) need (help) fixing it)"; 

$s =~ s{\(.+\)}{()}; 

print "$s\n"; 
+0

यह तब तक काम करता है जब तक केवल एक शीर्ष स्तर कोष्ठक का सेट होता है। अन्यथा, एक स्ट्रिंग जैसे "यह मेरा है (स्ट्रिंग (वह)) I (फिक्सिंग में मदद की ज़रूरत है)" बन जाएगा "यह मेरा()" है "यह मेरा है() I()" – bobDevil

10

मॉड्यूल Regexp::Common सौदों: अंत में, हम एक बस () युक्त कि स्ट्रिंग की जगह।

use strict; 
use warnings; 
use Regexp::Common qw/balanced/; 

my @strings = (
    '111(22(33)44)55', 
    'a(b(c(d)(e))f)g(h)((i)j)', 
    'this is my string (though (I) need (help) fixing it)', 
); 

s/$RE{balanced}{-parens=>'()'}/()/g for @strings; 

print "$_\n" for @strings; 

आउटपुट:

111()55 
a()g()() 
this is my string()
+1

वाह, कूल! Regexp :: सामान्य रूप से मुझे रेगेक्सन के अपने वर्बोज़ सेट के साथ आश्चर्यचकित करता है ... –

+0

साइनन, कोड में स्पष्टीकरण के लिए धन्यवाद। –

+0

मुझे आश्चर्य नहीं है कि यह पर्ल की एक पंक्ति में किया जा सकता है, लेकिन मुझे हैरान है कि यह पठनीय है! – dreamlax

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