Navrhuji tento regulární výraz:
^([^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]+[[:>:]])*$
Je to trochu dlouhé, ale umožňuje to větší flexibilitu, protože tyto řetězce jsou také považovány za „platné“:
(2/2) 2new 2new
2new (2/2) 2new (2/2)
V kódu
SELECT
*
FROM
A
WHERE
description REGEXP '^(([^2]+|[[:<:]][0-9]+/[0-9]+[[:>:]])*2([[:>:]]|[a-z])){2}([^2]+|[[:<:]][0-9]+/[0-9]+[[:>:]])*$'
Rozdělení podle regulárních výrazů
Regulární výraz ve skutečnosti používá mnoho opakujících se částí, takže proto je trochu dlouhý:
^ # 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
$
Podrobný rozpis
-
#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
Hranice slova odpovídá začátku a konci slova. Definicí slova je zde řada abecedy, čísel a podtržítek.
[[:<:]]
je úvodní hranice slova, a proto se shoduje na začátku slova.
[[:>:]]
je počáteční hranice slova, a proto se shoduje na konci slova.
Jejich použití zde zajišťuje, že 2
(a numerické/numerické části) nejsou obklopeny jinými čísly (proto tvoří 21
například selhání) nebo počítejte 2
pokud máte například 21/4
jako jeden, který se počítá do dvou 2
s v řetězci.