2013-03-20 8 views
5

मैं शीर्ष पर अपनी स्क्रिप्ट में एक regexp निरंतर परिभाषित करना चाहता हूं और दिनांक स्ट्रिंग के प्रारूप की जांच के लिए इसे बाद में उपयोग करना चाहता हूं।मैं एक regexp पैटर्न को पर्ल में स्थिर के रूप में कैसे परिभाषित कर सकता हूं?

मेरी तारीख स्ट्रिंग के रूप में

$ एक = "2013-03-20 11: 09: 30.788" परिभाषित किया जाएगा;

लेकिन यह असफल रहा। मुझे कैसे करना चाहिए?

use strict; 
use warnings; 


use constant REGEXP1 => "/^\d{4}\D\d{2}\D\d{2}\D\d{2}\D\d{2}\D\d{2}\D\d{3}$/"; 

$a="2013-03-20 11:09:30.788"; 
if(not $a=~&REGEXP1){ 
     print "not" 

}else{ 
     print "yes" 

} 
print "\n"; 

उत्तर

3

पर्ल का कौन सा संस्करण आप उपयोग कर रहे हैं? यह 5.8.8 (लेकिन 5.004) यदि आप इसे इस को बदलने में मेरे लिए काम करता:

use constant REGEXP1 => qr/^\d{4}\D\d{2}\D\d{2}\D\d{2}\D\d{2}\D\d{2}\D\d{3}$/; 
9

सबसे पहले, आप पर चेतावनी था "/^\d{4}\D\d{2}\D\d{2}\D\d{2}\D\d{2}\D\d{2}\D\d{3}$/"; को देखो तुम मिल गया है चाहिए:

Unrecognized escape \d passed through at C:\temp\jj.pl line 7. 
Unrecognized escape \D passed through at C:\temp\jj.pl line 7. 
Unrecognized escape \d passed through at C:\temp\jj.pl line 7. 
…

यदि आप REGEXP1 के मान को प्रिंट करते हैं, तो आपको /^d{4}Dd{2}Dd{2}Dd{2}Dd{2}Dd{2}Dd{3} (* प्रतीक्षा करें, $/ क्या हुआ?)। जाहिर है, यह आपके इच्छित पैटर्न की तरह दिखता नहीं है।

अब, आप "/^\\d{4}\\D\\d{2}\\D\\d{2}\\D\\d{2}\\D\\d{2}\\D\\d{2}\\D\\d{3}\$/" टाइप कर सकते हैं और फिर उस स्ट्रिंग को पैटर्न में विभाजित कर सकते हैं, लेकिन यह बहुत अधिक काम है। इसके बजाय, आप अपने निरंतर regexp quote operator, qr का उपयोग कर परिभाषित कर सकते हैं: \d और \D सिर्फ [0-9] और [^0-9] की तुलना में अधिक क्रमश: मिलान हो जाएगा:

#!/usr/bin/env perl 

use 5.012; 
use strict; 
use warnings; 

use constant REGEXP1 => qr/^\d{4}\D\d{2}\D\d{2}\D\d{2}\D\d{2}\D\d{2}\D\d{3}$/; 

my $s = "2013-03-20 11:09:30.788"; 

say $s =~ REGEXP1 ? 'yes' : 'no'; 

एक और पकड़ लिया है। तो, बजाय, आप की तरह अपने पैटर्न लिख सकते हैं:

use constant REGEXP1 => qr{ 
    \A 
    (?<year> [0-9]{4}) - 
    (?<month> [0-9]{2}) - 
    (?<day> [0-9]{2}) [ ] 
    (?<hour> [0-9]{2}) : 
    (?<min> [0-9]{2}) : 
    (?<sec> [0-9]{2}) [.] 
    (?<msec> [0-9]{3}) 
    \z 
}x; 

लेकिन, आप अभी भी है कि क्या उन मूल्यों को सार्थक कर रहे हैं के सवाल के साथ छोड़ दिया जाता है। यदि यह मायने रखता है, तो आप DateTime::Format::Strptime का उपयोग कर सकते हैं।

#!/usr/bin/env perl 

use 5.012; 
use strict; 
use warnings; 

use DateTime::Format::Strptime; 

my $s = "2013-03-20 11:09:30.788"; 

my $strp = DateTime::Format::Strptime->new(
    pattern => '%Y-%m-%d %H:%M:%S.%3N', 
    on_error => 'croak', 
); 

my $dt = $strp->parse_datetime($s); 
say $strp->format_datetime($dt); 
+0

'[0-9]' के बाहर '\ d' और' \ D' मिलान क्या करते हैं? – RickF

+1

[perldoc perlrecharclass] में "अंक" देखें (http://perldoc.perl.org/perlrecharclass.html)। * इसका अर्थ यह है कि जब तक '/ a' संशोधक प्रभावी नहीं होता है \ n' न केवल अंकों '' 0 '-' 9'' से मेल खाता है, बल्कि अरबी, देवनागरी और अन्य भाषाओं के अंक भी मेल खाता है। इससे कुछ भ्रम हो सकता है, और कुछ सुरक्षा समस्याएं हो सकती हैं। * –

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

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