Perl Language
नियमित अभिव्यक्ति
खोज…
मिलान तार
=~
ऑपरेटर एक स्ट्रिंग के लिए एक नियमित अभिव्यक्ति ( /
अलग सेट) का मिलान करने का प्रयास करता है:
my $str = "hello world";
print "Hi, yourself!\n" if $str =~ /^hello/;
/^hello/
वास्तविक नियमित अभिव्यक्ति है। ^
एक विशेष चरित्र है जो स्ट्रिंग की शुरुआत के साथ शुरू करने के लिए नियमित अभिव्यक्ति बताता है और कहीं बीच में मेल नहीं खाता है। फिर रेगेक्स निम्नलिखित अक्षरों को क्रम में h
, e
, l
, l
, और o
खोजने की कोशिश करता है।
नियमित अभिव्यक्तियाँ डिफ़ॉल्ट चर से मिलान करने का प्रयास करती हैं ( $_
) यदि नंगे:
$_ = "hello world";
print "Ahoy!\n" if /^hello/;
आप भी अलग-अलग सीमांकक का उपयोग कर सकते हैं क्या आप m
ऑपरेटर के साथ नियमित अभिव्यक्ति से पहले हैं:
m~^hello~;
m{^hello};
m|^hello|;
जब तार /
वर्ण शामिल होते हैं तो यह उपयोगी होता है:
print "user directory" if m|^/usr|;
पैटर्न मिलान में \ Q और \ E का उपयोग
\ Q और \ E के बीच जो है उसे सामान्य वर्णों के रूप में माना जाता है
#!/usr/bin/perl
my $str = "hello.it's.me";
my @test = (
"hello.it's.me",
"hello/it's!me",
);
sub ismatched($) { $_[0] ? "MATCHED!" : "DID NOT MATCH!" }
my @match = (
[ general_match=> sub { ismatched /$str/ } ],
[ qe_match => sub { ismatched /\Q$str\E/ } ],
);
for (@test) {
print "\String = '$_':\n";
foreach my $method (@match) {
my($name,$match) = @$method;
print " - $name: ", $match->(), "\n";
}
}
उत्पादन
String = 'hello.it's.me': - general_match: MATCHED! - qe_match: MATCHED! String = 'hello/it's!me': - general_match: MATCHED! - qe_match: DID NOT MATCH!
रेगेक्स के साथ एक स्ट्रिंग पार्स करना
आम तौर पर, एक जटिल संरचना को पार्स करने के लिए एक नियमित अभिव्यक्ति का उपयोग करना एक अच्छा विचार नहीं है। लेकिन यह किया जा सकता है। उदाहरण के लिए, हो सकता है कि आप डेटा को हाइव टेबल में लोड करना चाहें और फ़ील्ड कॉमा से अलग हो जाएं, लेकिन जटिल प्रकार जैसे सरणी को "|" द्वारा अलग किया जाता है। फ़ाइलों में अल्पविराम द्वारा अलग किए गए सभी फ़ील्ड के रिकॉर्ड होते हैं और जटिल प्रकार वर्ग ब्रैकेट के अंदर होते हैं। उस स्थिति में, डिस्पोजेबल पर्ल का यह बिट पर्याप्त हो सकता है:
echo "1,2,[3,4,5],5,6,[7,8],[1,2,34],5" | \
perl -ne \
'while( /\[[^,\]]+\,.*\]/ ){
if( /\[([^\]\|]+)\]/){
$text = $1;
$text_to_replace = $text;
$text =~ s/\,/\|/g;
s/$text_to_replace/$text/;
}
} print'
आप आउटपुट की जांच करना चाहेंगे:
1,2, [3 | 4 | 5], 5,6, [7 | 8], [1 | 2 | 34], 5
नियमित अभिव्यक्ति का उपयोग करके एक स्ट्रिंग बदलें
s/foo/bar/; # replace "foo" with "bar" in $_
my $foo = "foo";
$foo =~ s/foo/bar/; # do the above on a different variable using the binding operator =~
s~ foo ~ bar ~; # using ~ as a delimiter
$foo = s/foo/bar/r; # non-destructive r flag: returns the replacement string without modifying the variable it's bound to
s/foo/bar/g; # replace all instances