我提出這個表達式:
^([^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]+[[:>:]])*$'
SQLFiddle
正則表達式擊穿
實際使用許多重複的部分,所以這就是爲什麼它是一個有點長的正則表達式:
^ # 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在字符串中。
對不起..錯誤的打字 – muhnizar 2014-09-02 02:32:15
在第二個期望中,除了空格外,你的意思是什麼 – hwnd 2014-09-02 02:35:16
- 它沒有在ID = 2中顯示結果,因爲在2之後有1(2之後的字符必須是varchar) - 它會在ID = 3中顯示結果,因爲之前/之前2只有空白(除了在空白之前/之前) – muhnizar 2014-09-02 02:39:56