この正規表現を提案します:
^([^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つの2
にカウントされるものとして 文字列内のs。