2013-08-18 5 views
5
#!/usr/bin/perl 

use strict; 
use warnings; 
my $string = "praveen is a good boy"; 
my @try = split(/([a,e,i,o,u]).*\1/,$string); 
print "@try\n"; 

मैं किसी दिए गए स्ट्रिंग में 2 आसन्न स्वर वाले सभी शब्दों को मुद्रित करने का प्रयास कर रहा हूं।
ओ/पी: "प्रवीण" और "अच्छा" होना चाहिए।पैटर्न मिलान के माध्यम से शब्दों को निकालने के लिए कैसे?

मैंने नकारात्मक भाग [^] को विभाजित करने और केवल 2 आसन्न स्वर देने के लिए प्रयास किया।

+0

करें सटा हुआ स्वरों को युगल "ए", "ई", "ओओ" होना चाहिए। या क्या हमारे पास "ईए", "कहां" आदि भी हो सकता है? –

+0

यह कोई संयोजन हो सकता है लेकिन आसन्न को एक स्वर – Angus

+1

ठीक होना चाहिए, स्पष्टीकरण के लिए धन्यवाद, मैंने अपना जवाब समायोजित कर दिया है। आप ओपी में अधिक उदाहरण डेटा प्रदान करना चाह सकते हैं, क्योंकि इसमें केवल डबल स्वर हैं, और रेगेक्स पर आपका पहला प्रयास ऐसा लगता है कि आप युगल के लिए भी प्रयास कर रहे हैं। –

उत्तर

10

पर्ल समारोह split नहीं मिलान की सूची पाने के लिए बेहद उपयुक्त है, मैं regex संशोधक g का उपयोग कर की सिफारिश करेंगे, आप या तो पाश जैसे का उपयोग कर सकते हैं, है। इसके बजाय। सभी मैचों के संसाधन के लिए while, या आप एक ही बार में मैचों की सूची प्रदान कर सकते हैं

निम्न उदाहरण एक स्ट्रिंग में सभी शब्दों जो दो आसन्न स्वर होते हैं मैच चाहिए:।

my $string = "praveen is a good boy"; 
while ($string =~ /(\w*[aeiou]{2}\w*)/g) { 
    print "$1\n" 
} 

आउटपुट:

praveen 
good 

तुम भी ऐसा कर सकता है:

my @matches = ($string =~ /\w*[aeiou]{2}\w*/g); 

और परिणाम है कि कैसे आप ओपी में @try प्रसंस्करण कर रहे थे के लिए इसी तरह की प्रक्रिया।

+1

बेहतर '\ w *', नहीं? अन्यथा यह उदाहरण के साथ अपेक्षित काम नहीं करेगा: 'हारून एक अच्छा लड़का है' – Birei

+1

यह उन मामलों को संभाल नहीं करता है जहां अंतिम शब्द ने स्वरों को दोगुना कर दिया है। आप '$ string = ~/(\ w + ([aeiou]) {2} (?: \ W + | \ b))/g' जो तब प्रवीण के साथ काम करता है वह एक अच्छा लड़का है, हूट, हू।" ' – JRFerguson

+0

सुझाए गए सुधारों के लिए धन्यवाद। मुझे पूरा यकीन नहीं है कि स्वर मिलान अभी तक सही है या नहीं। ओपी के शब्द "दो आसन्न स्वर" हैं, लेकिन "डबल स्वर" मूल रेगेक्स से लक्ष्य की तरह दिखते हैं। –

3
#!/usr/bin/perl 

use strict; 
use warnings; 
my $string = "praveen is a good boy"; 
my @try = split(/\s/,$string); 
for(@try) { 
# if(/[a,e,i,o,u]{2}/) { 
    if(/[aeiou]{2}/) { # edited after Birei's comment 
     print "$_\n"; 
    }; 
}; 

"विभाजन" का पहला तर्क एक डिलीमीटर है। स्प्लिट विभाजन (-8

+0

चरित्र वर्गों के अंदर आपको प्रत्येक को अलग करने की आवश्यकता नहीं है। और इस तरह से यह खराब परिणाम दे सकता है, जैसे: 'प्राव, एन'। – Birei

+0

मेरी गलती, मैंने बस इसे मूर्खतापूर्वक कॉपी किया। संपादित। – darken

6

.. तुम कुछ की तरह कर सकता है

#!/usr/bin/perl 

use strict; 
use warnings; 

my $str 
    = "praveen is a good boy\n" 
    . "aaron is a good boy\n" 
    . "praveen and aaron are good, hoot, ho" 
    ; 

while ($str =~ /(\w*([aeiou])\2(?:\w*))/g) { 
     print $1, "\n"; 
} 

नियमित अभिव्यक्ति:

(    group and capture to \1: 
\w*   word characters (a-z, A-Z, 0-9, _) (0 or more times) 
    (   group and capture to \2: 
    [aeiou]  any character of: 'a', 'e', 'i', 'o', 'u' 
    )   end of \2 
    \2   what was matched by capture \2 
    (?:   group, but do not capture: 
     \w*  word characters (a-z, A-Z, 0-9, _) (0 or more times) 
    )   end of grouping 
)    end of \1 

मूल रूप से कर के रूप में ही है कौन सा /(\w*([aeiou])[aeiou]+(?:\w*))/

आउटपुट:

praveen 
good 
aaron 
good 
praveen 
aaron 
good 
hoot 
+0

यह वास्तव में 4+ अक्षरों के शब्दों को निकालने वाला है जिसमें बीच में एक स्वर होता है (चरित्र 1 से एन -2 जहां एन शब्द की लंबाई है)। । । कोशिश करें "हाथी बैंगनी हैं" –

+0

"हाथी बैंगनी" के साथ अपने regex आज़माएं और फिर मेरा। । । इसमे अंतर है। दुर्भाग्यवश सभी नमूना वाक्यों में सभी मिलान करने वाले शब्दों के लिए 4+ अक्षर हैं। तो "हो" से "हू", और अन्य रूपों को बदलें।ध्यान दें कि मेरा रेगेक्स या तो शुरू करने का अधिकार नहीं था, और इसे किसी को मुझे इंगित करने की आवश्यकता थी। –

+0

इसे फिक्स्ड। धन्यवाद। – hwnd

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