2009-08-06 14 views
6

पार्स होगा मैं एक regex कि निम्न मान स्वीकार करेगा बनाने के लिए कोशिश कर रहा हूँ:एक regex कि 00.00

  • (खाली)
  • 00,0
  • 00,00

मैं ([0-9]){0,2}\.([0-9]){0,2} के साथ आया जो मुझे कहता है "अंक 9 से 9 0 होते हैं 2 बार, उसके बाद '।' चरित्र (जो वैकल्पिक होना चाहिए), 0 से 9 गुणा 0 से 2 गुना अंकों के बाद। यदि केवल 2 अंक '।' दर्ज किए जाते हैं। आवश्यक नहीं है क्या इस regex साथ कुछ गड़बड़ है

+0

यह कैसे असफल रहा है? इस तथ्य के अलावा कि '।' वैकल्पिक नहीं है, क्योंकि जोआचिम बताता है, मैं देख सकता हूं कि यह बहुत अनुमोदित है (उदाहरण के लिए यह 00. और .00 की अनुमति देता है)। इसके अलावा, आप किस भाषा का उपयोग कर रहे हैं? – Beta

उत्तर

15

आप डॉट वैकल्पिक नहीं किया:।?।

[0-9]{0,2}(\.[0-9]{1,2})? 
+0

बिल्कुल सही! धन्यवाद। –

+0

वह '.0' से भी मेल खाता है। क्या ये ठीक है? यदि नहीं, तो आपको पहले भाग को '[0-9] {1,2} 'में बदलना चाहिए। इससे बदले में (रिक्त) असफल हो जाएगा। आप पूरी चीज को लपेटकर उस समस्या को हल कर सकते हैं (...)? लेकिन यह शायद अलग (खाली) की जांच करने के लिए और अधिक समझ में आता है। –

+3

एक चेतावनी: यह रेगेक्स कुछ भी मेल खाएगा क्योंकि सभी भाग वैकल्पिक हैं। यदि आप इसे "ए" से मेल करने के लिए कहते हैं, तो यह सफल होगा क्योंकि यह खाली स्थान "ए से पहले" से मेल खाता है। शायद आपको^और $ के साथ रेगेक्स एंकर करना चाहिए (क्योंकि आप एक खाली स्ट्रिंग से मेल खाना चाहते हैं)। –

3

सबसे पहले, के रूप में यह पहली बार में था {0-2}{0,2} होना चाहिए

दूसरी बात आप समूह पुनरावृत्ति वर्गों के साथ-साथ करने के लिए यह करने के बाद कुछ की जरूरत है।

तीसरा, आप पूरे अंतिम भाग वैकल्पिक बनाने की जरूरत है। वहाँ एक बिंदु है क्योंकि अगर, वहाँ होना चाहिए, आप भी करने के लिए दूसरा पुनरावृत्ति बात बदलना चाहिए {1,2}

([0-9]{0,2})(\.([0-9]{1,2}))? 
2

अपने regex के साथ कुछ समस्याएं हैं: वाइल्डकार्ड के रूप में

  1. डॉट विशेष वर्ण है, और कार्य करता है; यदि आप एक शाब्दिक बिंदु चाहते हैं, तो आपको इसे बचाना होगा (\.)।
  2. भले ही आपने डॉट को वाइल्डकार्ड न होने के लिए प्रतिस्थापित किया हो, फिर भी आपका रेगेक्स "0." जैसे स्ट्रिंग से मेल खाता है। क्योंकि आपने नियमित अभिव्यक्ति इंजन को केवल डॉट से मिलान करने के लिए नहीं बताया है, यदि उसके बाद संख्याएं हैं।
  3. क्योंकि आपकी अभिव्यक्ति anchored नहीं है, यह तारों से मेल खा सकती है जिसमें दूसरे शब्द के भीतर पैटर्न शामिल है, उदाहरण के लिए (यानी ab12 मिलान होगा)।

एक बेहतर पैटर्न होगा कुछ की तरह:

/\b[0-9]{0,2}(?:\.[0-9]{1,2})?\b/ 

ध्यान दें कि (?:...) बनाता समूह एक backreference, जो संभवत: आपके मामले में की जरूरत नहीं है नहीं बना।

1

पेर्ल में चित्रित एक तरीका है, से मिलान करने के लिए केवल मिलान करने वाले स्ट्रिंग्स। महत्वपूर्ण हिस्सा खाली तारों से मेल खाने के लिए इसकी विधि है: यह हर पैटर्न तत्व को वैकल्पिक नहीं बनाता है, एक रणनीति जिसमें लगभग हर स्ट्रिंग से मेल खाने का अवांछनीय प्रभाव होता है।

use warnings; 
use strict; 

my @data = (
    '', 
    '0', 
    '00', 
    '00.0', 
    '00.00', 
    'foo', # Should not match. 
    '.0',  # Should not match. 
); 

for (@data){ 
    print $_, "\n" if /^$|^[0-9]{1,2}(\.[0-9]{1,2})?$/; 
} 
0

उपरोक्त उदाहरणों में से अधिकांश शुरुआत ^ लंगर नहीं है और डेटा के $ अंत हो गया।

मैं निम्न में से एक के साथ इसे हल होगा:

  • ^[[:digit:]]{0,2}([.][[:digit:]]{1,2})$
  • ^\d{0,2}([.]\d{1,2})$
  • ^[0-9]{0,2}([.][0-9]{1,2})$

पठनीयता के लिए, मैं आम तौर पर \. करने के लिए [.] का उपयोग करने और तरह POSIX वर्गों का उपयोग करना पसंद करते हैं [[:digit:]]