मुझे 4-10 अंकों के बीच किसी भी संख्या को निकालने की आवश्यकता है जो सीधे 'पीओ #' या 'पीओ #' (एक सफेद जगह के साथ) के बाद आती है। मैं निकाले गए वास्तविक मूल्य के साथ पीओ # को शामिल नहीं करना चाहता, हालांकि मुझे स्ट्रिंग के भीतर मान को लक्षित करने के लिए मानदंड के रूप में इसकी आवश्यकता है। यदि अंक 4 से कम या 10 से अधिक हैं, तो मैं मूल्य पर कब्जा नहीं करना चाहता और अन्यथा इसे अनदेखा करना चाहूंगा।

एक नमूना स्ट्रिंग इस तरह दिखेगी:

पीओ#12445 विक्रेता उद्यम के लिए

या

पीओ# 12445 . के लिए विक्रेता उद्यम के लिए चालान# 21412556

मेरी वर्तमान रेगेक्स अभिव्यक्ति पीओ # को '#' के साथ कैप्चर करती है और मैं '#' को हटाने के लिए तथ्य के बाद अतिरिक्त तर्क का उपयोग करता हूं, हालांकि मेरी अभिव्यक्ति चालान # और चालान # को भी कैप्चर कर रही है जिसे मैं नहीं चाहता। मैं चाहता हूं कि यह केवल पीओ # को लक्षित करे।

वर्तमान अभिव्यक्ति: [P][O][#]\s*[0-9]{3,9}\d+\w

किसी भी तरह की सहायता का स्वागत किया जाएगा!

1
Poe 20 अक्टूबर 2020, 09:21

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

संपादित करें: शब्द सीमाएँ जोड़ी गईं

0
Max Xapi 20 अक्टूबर 2020, 09:56

अगर PCRE उपलब्ध है, तो कैसे: PO#\s*\K\d{4,10}(?=\D|$)

  • PO#\s* प्रमुख सबस्ट्रिंग "PO#" से मेल खाता है जिसके बाद 0 या अधिक व्हाइटस्पेस आते हैं।
  • \K मैच की शुरुआती स्थिति को रीसेट करता है और एक सकारात्मक (शून्य लंबाई) के रूप में काम करता है।
  • \d{4,10} 4 <= लंबाई <= 10 के अंकों के अनुक्रम से मेल खाता है।
  • (?=\D|$) एक गैर-अंकीय वर्ण या स्ट्रिंग के अंत से मेल खाने के लिए सकारात्मक लुकहेड है।
0
tshiono 20 अक्टूबर 2020, 10:05