मैं इस रेगेक्स का प्रस्ताव करता हूं:
^([^2]|[[:<:]][0-9]+/[0-9]+[[:>:]])*([[:<:]]|[a-z])2([[:>:]]|[a-z])([^2]|[[:<:]][0-9]+/[0-9]+[[:>:]])+([[:<:]]|[a-z])2([[:>:]]|[a-z])([^2]|[[:<:]][0-9]+/[0-9]+[[:>:]])*$
यह थोड़ा लंबा है, लेकिन यह कुछ और लचीलेपन की अनुमति देता है जिसमें उन स्ट्रिंग्स को 'वैध' भी माना जाता है:
(2/2) 2new 2new
2new (2/2) 2new (2/2)
कोड में
SELECT
*
FROM
A
WHERE
description REGEXP '^(([^2]+|[[:<:]][0-9]+/[0-9]+[[:>:]])*2([[:>:]]|[a-z])){2}([^2]+|[[:<:]][0-9]+/[0-9]+[[:>:]])*$'
रेगेक्स विश्लेषण
रेगेक्स वास्तव में कई दोहराए जाने वाले भागों का उपयोग करता है, इसलिए यह थोड़ा लंबा है:
^ # Beginning of string
( # Open repeat group
([^2]+|[[:<:]][0-9]+/[0-9]+[[:>:]])* # Any characters. See #1
2 # 2
([[:>:]]|[a-z]) # Word boundary or alphabet/letter. See #2
){2} # Close repeat group and repeat 2 times
([^2]+|[[:<:]][0-9]+/[0-9]+[[:>:]])* # Any characters. See #1
$
विस्तृत विश्लेषण
-
#1
( # Open group [^2]+ # Any characters except 2 | # OR [[:<:]] # Open word boundary [0-9]+ # Any numbers / # Forward slash [0-9]+ # Any numbers [[:>:]] # Close word boundary )* # Close group and repeat any number of times
-
#2
( # Open group [[:>:]] # Word boundary | # Or [a-z] # Letter/alphabet ) # Close group
एक शब्द सीमा शब्दों की शुरुआत और अंत से मेल खाती है। यहाँ एक शब्द की परिभाषा वर्णमाला, संख्याओं और अंडरस्कोर वर्णों की एक श्रृंखला है।
[[:<:]]
एक प्रारंभिक शब्द सीमा है और इस प्रकार एक शब्द की शुरुआत में मेल खाता है।
[[:>:]]
एक प्रारंभिक शब्द सीमा है और इस प्रकार एक शब्द के अंत में मेल खाता है।
यहां उनका उपयोग सुनिश्चित करता है कि 2
(और संख्यात्मक/संख्यात्मक भाग) अन्य संख्याओं से घिरे नहीं हैं (इसलिए 21
. बनाता है उदाहरण के लिए विफल) या 2
. की गणना करें यदि आपके पास उदाहरण के लिए 21/4
. है एक के रूप में जो दो 2
. की ओर गिना जाता है s स्ट्रिंग में।