पते के रूप में पीओ बॉक्स का पता लगाने के लिए यह मेरी वर्तमान अभिव्यक्ति है:

^\s*((P(OST)?.?\s*(O(FF(ICE)?)?)?.?\s+(B(IN|OX))?)|B(IN|OX))

यह POBox और P.O.Box (जहां B से पहले कोई जगह नहीं है) को छोड़कर मेरी जरूरत की हर चीज से मेल खाता है। मैं इसे शामिल करने के लिए अपनी अभिव्यक्ति को कैसे समायोजित कर सकता हूं?

परीक्षण के लिए लिंक: https://regex101.com/r/vKDiWW/1

1
Paul Ruocco 12 जून 2020, 23:08
1
आप किस तार से मेल खाना चाहते हैं? क्योंकि यह रेगेक्स कभी सही नहीं हो सकता। (9 समूहों को कैप्चर करना, POST. OFFICE. BIN और P OFF. मान्य हैं, आदि)
 – 
Ron van der Heijden
12 जून 2020, 23:49

2 जवाब

जहाँ B . से पहले कोई स्थान नहीं है

ठीक है, आपकी अभिव्यक्ति में \s+ है और इस पैटर्न के लिए एक या अधिक रिक्त स्थान की आवश्यकता है।

\s* या [[:space:]]* का प्रयोग करें:

^\s*((P(OST)?.?\s*(O(FF(ICE)?)?)?.?\s*(B(IN|OX))?)|B(IN|OX))

देखें प्रमाण

0
Ryszard Czech 12 जून 2020, 23:28

मैं यह मानने जा रहा हूं कि आपका मतलब शाब्दिक बिंदुओं से मेल खाना है और किसी भी गैर-न्यूलाइन चरित्र से मेल नहीं खाता है - तो अब आप देखेंगे कि पैटर्न में बिंदु बच निकले हैं।

मैंने आपके आवश्यक तर्क की सराहना करने के लिए बिंदुओं को पैटर्न में स्थानांतरित किया और मैंने कुछ अनावश्यक कोष्ठक भी हटा दिए हैं। स्पष्टीकरण के लिए मेरी इनलाइन टिप्पणियाँ देखें।

पैटर्न:

~^\s*(P(\.|OST)?\s*(O(\.|FF(ICE)?)?)?\s*(B(IN|OX))?|B(IN|OX))~i

रेगेक्स (डेमो)

^
\s*
(
  P(\.|OST)?              #P or P. or POST
  \s*
  (O(\.|FF(ICE)?)?)?      #nothing or O or O. or OFF or OFFICE
  \s*
  (B(IN|OX))?             #nothing or BIN or BOX
  |
  B(IN|OX)
)

सभी वैकल्पिक रिक्त स्थान और केस-असंवेदनशीलता की उपेक्षा करते हुए, उपरोक्त पैटर्न 45 निम्नलिखित मिलान करेगा:

BIN
BOX
P
PBIN
PBOX
PO
POBIN
POBOX
PO.
PO.BIN
PO.BOX
POFF
POFFBIN
POFFBOX
POFFICE
POFFICEBIN
POFFICEBOX
P.
P.O
P.OBIN
P.OBOX
P.O.
P.O.BIN
P.O.BOX
P.OFF
P.OFFBIN
P.OFFBOX
P.OFFICE
P.OFFICEBIN
P.OFFICEBOX
POST
POSTBIN
POSTBOX
POSTO
POSTOBIN
POSTOBOX
POSTO.
POSTO.BIN
POSTO.BOX
POSTOFF
POSTOFFBIN
POSTOFFBOX
POSTOFFICE
POSTOFFICEBIN
POSTOFFICEBOX
0
mickmackusa 13 जून 2020, 18:30