2013-01-10 11 views
5

के साथ दो ओवरलैपिंग पैटर्न मिलान करना मुझे आशा है कि मेरा प्रश्न किसी और द्वारा पहले से ही नहीं देखा गया है, क्योंकि मैंने साइट पर लगभग हर जगह देखने की कोशिश की लेकिन मैं जवाब खोजने में सक्षम नहीं था।पर्ल

मेरे समस्या है: मैं एक PERL स्क्रिप्ट जो हर घटना एक या एक स्ट्रिंग में एक और पैटर्न के की स्थिति का पता लगाने के लिए है बना रहा हूं।

उदाहरण के लिए:

$string = "betaalphabetabeta"; 
$pattern = "beta|alpha"; 

इस मामले में, मैं 4 मैचों वापस जाने के लिए मेरी स्क्रिप्ट चाहते हैं।

मैंने सोचा था कि यह आसानी से मैच ऑपरेटर किसी न किसी प्रकार इस तरह में उपयोग करके प्राप्त किया जा सकता है:,

$string =~ /beta|alpha/g; 

हालांकि, मेरे दो पैटर्न के बाद से ("अल्फा" "बीटा",) कर रहे हैं आंशिक रूप से अतिव्यापी टुकड़ा कोड जो मैंने अभी पोस्ट किया है, पहले पैटर्न की किसी भी घटना को छोड़ देता है जब यह दूसरे के साथ ओवरलैप होता है।

उदा। ? अगर मैं इस तरह एक स्ट्रिंग है:

$string = "betalphabetabeta"; 

यह बजाय केवल 4.

मैं = ऑपरेटर के साथ कुछ करने के लिए कोशिश की है 3 मैचों देता है, लेकिन मैं इस जोड़ी पर प्रबंधन नहीं कर सकते यह ओआर ऑपरेटर के साथ सही तरीके से ...

क्या किसी के पास कोई समाधान है? आपकी सहायताके लिए धन्यवाद!

+0

आप अपने कोड के अधिक मैचों की संख्या लौटने हिस्सा पोस्ट कर सकते हैं उदाहरण के लिए,? – Perleone

+3

[कैसे-करें-i-substitute-overlapping-match-with-a-perl-regex] (http://stackoverflow.com/questions/6572189/how-do-i-substitute-overlapping-matches-with-a -पीएलएल-रेगेक्स) –

+0

@mugenkenichi अच्छी तरह से .. समाधान बहुत जटिल है..तुम इसके बजाय 'लुकहेड' का उपयोग कर सकते हैं! – Anirudha

उत्तर

7

निम्नलिखित एक शून्य चौड़ाई दावे का उपयोग करता है (मेरा मानना ​​है कि यही वह है जिसे इसे कहा जाता है)।

#!/usr/bin/perl 
use strict; 
use warnings; 

$_ = "betalphabetabeta"; 

while (/(?=(alpha|beta))/g) { 
    print $1, "\n"; 

प्रिंटों:

C:\Old_Data\perlp>perl t9.pl 
beta 
alpha 
beta 
beta 
5

आप looakahead का उपयोग करें और मैचों

(?=beta|alpha) 

पर्ल में परीक्षण नहीं की संख्या की गणना करने के लिए है, लेकिन काम करना चाहिए

काम करता है here

+2

आपको '(बीटा | अल्फा)' में माता-पिता की आवश्यकता नहीं है क्योंकि आपने कैप्चर किए गए टेक्स्ट – fge

+0

@fge hmm..oo के लिए कोई उपयोग नहीं किया है ... आप सही हैं ... – Anirudha

+0

(और हाँ, वैसे, यह perl में काम करेगा , चूंकि यह पर्ल है जो रेगेक्स में लुकराउंड पेश करता है: पी) – fge