2012-04-18 11 views
8

एक पर्ल अतः answer में, एक पोस्टर रिक्त स्ट्रिंग मिलान करने के लिए इस कोड का प्रयोग किया:

$userword =~ /^$/; #start of string, followed immediately by end of string 

जो brian d foy टिप्पणी की करने के लिए:

आप वास्तव में यह नहीं कह सकते कि क्योंकि वह एक विशेष गैर से मेल खाएगी -खाली स्ट्रिंग।

प्रश्न: जो गैर रिक्त स्ट्रिंग इस के अनुरूप है? क्या यह एक स्ट्रिंग है जिसमें "\r" शामिल है?

+1

यह वही गलती है http://stackoverflow.com/q/10200057/8817 है बनाना भी :) –

उत्तर

7

के डॉक्स जाँच करें, क्यों नहीं हम करते हैं? उद्धरण perlre,

$: पंक्ति के अंत का मिलान करें (या अंत में न्यू लाइन से पहले)

को देखते हुए

\z: मैच केवल स्ट्रिंग के अंत में

इसका मतलब है कि /^$/ के बराबर है /^\n?\z/

$ perl -E'$_ = ""; say /^$/ ||0, /^\n?\z/ ||0, /^\z/ ||0;' 
111 

$ perl -E'$_ = "\n"; say /^$/ ||0, /^\n?\z/ ||0, /^\z/ ||0;' 
110 

ध्यान दें कि /m परिवर्तन क्या ^ और $ मैच। किसी भी नई लाइन से पहले और स्ट्रिंग के अंत में /m, ^ किसी भी "लाइन" की शुरुआत में, और $ मैचों की शुरुआत में।

$ perl -E'$_ = "abc\ndef\n"; say "matched at $-[0]" while /^/g' 
matched at 0 

$ perl -E'$_ = "abc\ndef\n"; say "matched at $-[0]" while /$/g' 
matched at 7 
matched at 8 

और/मी का उपयोग कर:

$ perl -E'$_ = "abc\ndef\n"; say "matched at $-[0]" while /^/mg' 
matched at 0 
matched at 4 <-- new 

$ perl -E'$_ = "abc\ndef\n"; say "matched at $-[0]" while /$/mg' 
matched at 3 <-- new 
matched at 7 
matched at 8 

\A, \Z और \z नहीं कर रहे 'टी /m से प्रभावित:

$ perl -E'$_ = "abc\ndef\n"; say "matched at $-[0]" while /\A/g' 
matched at 0 

$ perl -E'$_ = "abc\ndef\n"; say "matched at $-[0]" while /\z/g' 
matched at 8 

$ perl -E'$_ = "abc\ndef\n"; say "matched at $-[0]" while /\Z/g' 
matched at 7 
matched at 8 
9
use strict; 
use warnings; 

use Test::More; 

ok("\n" =~ /^$/); 
ok("\n" =~ /^\z/); 
ok("\n" =~ /^\A\z/); # Better as per brian d. foy's suggestion 

done_testing; 

आप परीक्षण करना चाहते हैं, तो एक स्ट्रिंग खाली है, /^\z/ का उपयोग करें या (जो मैं क्या पसंद करते हैं है) यदि $str की length शून्य है।

आउटपुट:

ok 1 
not ok 2 
not ok 3
+4

यदि आप रेगेक्स का उपयोग करके खाली स्ट्रिंग के लिए परीक्षण करना चाहते हैं, तो '\ A' भी उपयोग करें।^गारंटी नहीं देता है कि इसके सामने कुछ भी नहीं है। –

+0

@briandfoy '^' के मामले में, मैं तब तक सुरक्षित हूं क्योंकि मैं 'एम' संशोधक का उपयोग नहीं करता हूं। दूसरी तरफ, '$ 'को मुझे बाहर जाने के लिए बाहरी संशोधक से कोई बदबूदार सहायता की आवश्यकता नहीं है ;-) –

+1

हालांकि आप सुरक्षित नहीं हैं, क्योंकि पर्ल में अब डिफ़ॉल्ट रेगेक्स झंडे हैं। हालांकि, जब आप अपवाद के बिना सटीक हो सकते हैं तो सटीक रूप से कुछ क्यों उपयोग करें? –

3

regex /^$/ गैर रिक्त स्ट्रिंग "\n" मेल खाता है।

डिफ़ॉल्ट रूप से, पर्ल नियमित अभिव्यक्ति मिलान मानता है कि स्ट्रिंग में टेक्स्ट की एक "पंक्ति" है।

^ लाइन की शुरुआत से मेल खाता है; /m संशोधक की अनुपस्थिति में, यह स्ट्रिंग की शुरुआत के समान ही है।

$ लाइन के अंत या अंत में एक नई लाइन से पहले मेल खाता है (यही कारण है कि /^$/ गैर-खाली स्ट्रिंग "\n" से मेल खाता है)।

का हवाला देते हुए perldoc perlre:

डिफ़ॉल्ट रूप से, "^" चरित्र से मेल करने के तार का केवल शुरुआत है, "$" चरित्र केवल अंत की गारंटी है (या पहले अंत में न्यू लाइन), और पर्ल धारणा के साथ कुछ अनुकूलन करता है कि स्ट्रिंग में केवल एक पंक्ति है। एम्बेडेड न्यूलाइन "^" या "$" से मेल नहीं खाया जाएगा। हालांकि, आप एक मल्टी-लाइन बफर के रूप में स्ट्रिंग का इलाज करना चाहते हैं, जैसे कि "^" स्ट्रिंग में किसी भी की नई लाइन के बाद मेल खाएगा (सिवाय इसके कि यदि नई पंक्ति स्ट्रिंग में अंतिम वर्ण है) और " $ "किसी भी नई लाइन से पहले मैच होगा। की लागत पर थोड़ा अधिक ओवरहेड, आप पैटर्न मिलान ऑपरेटर पर/m संशोधक का उपयोग कर ऐसा कर सकते हैं।

+0

यदि डाउनवोट के लिए कोई अच्छा कारण है, तो मैं इसे सुनना चाहता हूं। –

+0

@ सिननुनूर: डाउनवॉट्स निश्चित रूप से अज्ञात हैं, इसलिए हम यह सुनिश्चित नहीं कर सकते कि मुझे किसने गिरा दिया। किसी भी मामले में, मैं अधिक चिंतित था कि मेरे उत्तर में कुछ गड़बड़ हो सकती है। (मैंने पाया कि ज्यादातर अन्य अप्रत्यक्ष हैं, वास्तव में सवाल का जवाब देने से पहले एक स्पर्शरेखा पर जा रहे हैं।) कोई बड़ी बात नहीं। –

+0

यदि आप वास्तव में WHAT $ और^माध्य (मुझे पता है कि मैं पेल्डोक में सटीक लॉयरिंग परिभाषाओं को देख सकता हूं, तो यह संतुलन को उखाड़ फेंक देगा, यह केवल उत्तर में सुधार करने के तरीके पर एक संकेत है) – DVK

1

स्क्रिप्ट:

my $str = "\n"; 

my $test1 = ($str =~ /^$/) ? 1 : 0; 
my $test2 = ($str =~ /\A\z/) ? 1 : 0; 

print "$test1, $test2\n"; 

आउटपुट:

1, 0 
+0

यह सीनान के उत्तर से अलग कैसे है? – DVK

+0

@DVK - ** ** उनके ** संपादित करने और उसके जवाब में '\ A' जोड़ने के बाद बहुत कुछ अंतर नहीं है। –

+0

@stackoverflow कृपया ध्यान दें ** मैंने ** '\ A' शामिल करने के लिए अपना उत्तर संपादित नहीं किया। –

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