मैं दो अंकों को ढूंढना और कैप्चर करना चाहता हूं, केवल तभी जब स्ट्रिंग में कोई अन्य संख्या न हो, मेरे इनपुट:

foo 12 ✅
foo 12 bar ✅
12 baz ✅
9 foo 12 ❌
foo 12 baz 2 ❌
12 2 ❌

मैंने इस पैटर्न की कोशिश की

preg_match('`(?<=\d)\b\d\d\b(?=\d)`', $input);

लेकिन काम नहीं कर रहा

https://regex101.com/r/Gsvguc/1

4
Mwthreex 25 पद 2020, 00:14

2 जवाब

सबसे बढ़िया उत्तर

आपको पूरी स्ट्रिंग की जांच करने की आवश्यकता है ताकि कोई अन्य अंक न हो, इसलिए शुरुआत से शुरू करें। गैर-अंकों का मिलान करें, फिर मिलान को रीसेट करने के लिए \K का उपयोग करें (परिणाम के लिए यह आवश्यक है कि केवल दो अंक आप चाहते हैं), 2 अंकों का मिलान करें, और स्ट्रिंग के अंत तक कोई और अंक न देखें। :

^\D*\K\d{2}(?=\D*$)

https://regex101.com/r/Gsvguc/2

3
CertainPerformance 25 पद 2020, 00:19

एक अन्य विकल्प एक स्ट्रिंग को विफल करना है जिसमें दो अंक गैर-अंकों से अलग होते हैं और फिर दो अंकों से मेल खाते हैं:

.*\d\D+\d.*(*SKIP)(*F)|\b\d{2}\b

देखें प्रमाण:

enter image description here

स्पष्टीकरण

--------------------------------------------------------------------------------
  .*                       any character except \n (0 or more times
                           (matching the most amount possible))
--------------------------------------------------------------------------------
  \d                       digits (0-9)
--------------------------------------------------------------------------------
  \D+                      non-digits (all but 0-9) (1 or more times
                           (matching the most amount possible))
--------------------------------------------------------------------------------
  \d                       digits (0-9)
--------------------------------------------------------------------------------
  .*                       any character except \n (0 or more times
                           (matching the most amount possible))
--------------------------------------------------------------------------------
  (*SKIP)                    backtracking control verb that makes the regex engine
                             "skip" forward to this position on failure and tries 
                             to match again
--------------------------------------------------------------------------------
  (*F)                       fail the current match, proceed to search for a new one
--------------------------------------------------------------------------------
 |                        OR
--------------------------------------------------------------------------------
  \b                       the boundary between a word char (\w) and
                           something that is not a word char
--------------------------------------------------------------------------------
  \d{2}                    digits (0-9) (2 times)
--------------------------------------------------------------------------------
  \b                       the boundary between a word char (\w) and
                           something that is not a word char

पीएचपी उदाहरण :

if (preg_match('~.*\d\D+\d.*(*SKIP)(*F)|\b\d{2}\b~', 'foo 12', $match)) { echo "foo 12 >>> $match[0]\n"; }
if (preg_match('~.*\d\D+\d.*(*SKIP)(*F)|\b\d{2}\b~', '12 baz', $match)) { echo "12 baz >>> $match[0]\n"; }
if (preg_match('~.*\d\D+\d.*(*SKIP)(*F)|\b\d{2}\b~', '9 foo 12', $match)) { echo "9 foo 12 >>> $match[0]\n"; }
if (preg_match('~.*\d\D+\d.*(*SKIP)(*F)|\b\d{2}\b~', 'foo 12 baz 2', $match)) { echo "foo 12 baz 2 >>> $match[0]\n"; }
if (preg_match('~.*\d\D+\d.*(*SKIP)(*F)|\b\d{2}\b~', '12 2', $match)) { echo "12 2 >>> $match[0]\n"; }

परिणाम:

foo 12 >>> 12
12 baz >>> 12
2
Ryszard Czech 25 पद 2020, 01:05