Ich schlage diese Regex vor:
^([^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]+[[:>:]])*$
Es ist ein bisschen lang, aber es ermöglicht etwas mehr Flexibilität, da diese Zeichenfolgen ebenfalls als "gültig" betrachtet werden:
(2/2) 2new 2new
2new (2/2) 2new (2/2)
Im Code
SELECT
*
FROM
A
WHERE
description REGEXP '^(([^2]+|[[:<:]][0-9]+/[0-9]+[[:>:]])*2([[:>:]]|[a-z])){2}([^2]+|[[:<:]][0-9]+/[0-9]+[[:>:]])*$'
Regex-Aufschlüsselung
Die Regex verwendet tatsächlich viele sich wiederholende Teile, deshalb ist sie etwas lang:
^ # 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
$
Detaillierte Aufschlüsselung
-
#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
Eine Wortgrenze entspricht dem Anfang und Ende von Wörtern. Die Definition eines Wortes ist hier eine Reihe von Buchstaben, Zahlen und Unterstrichen.
[[:<:]]
ist eine öffnende Wortgrenze und passt somit am Anfang eines Wortes.
[[:>:]]
ist eine öffnende Wortgrenze und passt somit am Ende eines Wortes.
Ihre Verwendung hier stellt sicher, dass 2
(und die numerischen/numerischen Teile) sind nicht von anderen Zahlen umgeben (daher 21
zum Beispiel fehlschlagen) oder eine 2
zählen wenn Sie zum Beispiel 21/4
haben als einer, der zu den beiden 2
zählt s in der Zeichenfolge.