मुझे 4-10 अंकों के बीच किसी भी संख्या को निकालने की आवश्यकता है जो सीधे 'पीओ #' या 'पीओ #' (एक सफेद जगह के साथ) के बाद आती है। मैं निकाले गए वास्तविक मूल्य के साथ पीओ # को शामिल नहीं करना चाहता, हालांकि मुझे स्ट्रिंग के भीतर मान को लक्षित करने के लिए मानदंड के रूप में इसकी आवश्यकता है। यदि अंक 4 से कम या 10 से अधिक हैं, तो मैं मूल्य पर कब्जा नहीं करना चाहता और अन्यथा इसे अनदेखा करना चाहूंगा।
एक नमूना स्ट्रिंग इस तरह दिखेगी:
पीओ#12445 विक्रेता उद्यम के लिए
या
पीओ# 12445 . के लिए विक्रेता उद्यम के लिए चालान# 21412556
मेरी वर्तमान रेगेक्स अभिव्यक्ति पीओ # को '#' के साथ कैप्चर करती है और मैं '#' को हटाने के लिए तथ्य के बाद अतिरिक्त तर्क का उपयोग करता हूं, हालांकि मेरी अभिव्यक्ति चालान # और चालान # को भी कैप्चर कर रही है जिसे मैं नहीं चाहता। मैं चाहता हूं कि यह केवल पीओ # को लक्षित करे।
वर्तमान अभिव्यक्ति: [P][O][#]\s*[0-9]{3,9}\d+\w
किसी भी तरह की सहायता का स्वागत किया जाएगा!
2 जवाब
यदि आपको केवल अंकों की आवश्यकता है, तो आप \b(?<=PO#)\s?(\d{4,10})\b
का उपयोग कर सकते हैं:
(?<=PO#)
: सकारात्मक रूप से देखें, सुनिश्चित करें कि यह पैटर्न आवश्यक पैटर्न से पहले मौजूद है (पीओ के बाद #)\s?
: 0 या 1 खाली जगह(\d{4,10})
: ४ और १० अंकों के बीच\b
: शब्दों की सीमा से बचने के लिए यानी। 11 अंकों के पैटर्न मिलान के 10 पहले अंक या मिलान करने के लिए 'एसपीओ#'
संपादित करें: एलेक्ज़ेंडर माशिन निश्चित चौड़ाई होने के पीछे देखने के बारे में सही है, इसलिए \b(?<=PO#)\s?(\d{4,10})\b
बेहतर है https ://regex101.com/r/1KBQd1/5
संपादित करें: शब्द सीमाएँ जोड़ी गईं
अगर PCRE
उपलब्ध है, तो कैसे: PO#\s*\K\d{4,10}(?=\D|$)
PO#\s*
प्रमुख सबस्ट्रिंग "PO#" से मेल खाता है जिसके बाद 0 या अधिक व्हाइटस्पेस आते हैं।\K
मैच की शुरुआती स्थिति को रीसेट करता है और एक सकारात्मक (शून्य लंबाई) के रूप में काम करता है।\d{4,10}
4 <= लंबाई <= 10 के अंकों के अनुक्रम से मेल खाता है।(?=\D|$)
एक गैर-अंकीय वर्ण या स्ट्रिंग के अंत से मेल खाने के लिए सकारात्मक लुकहेड है।