您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

在MySQL中将正则表达式匹配为条件重复的单词,但不带括号

在MySQL中将正则表达式匹配为条件重复的单词,但不带括号

我提出这个正则表达式:

^([^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

$

(           # 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

(           # Open group

[[:>:]] # Word boundary | # Or [a-z] # Letter/alphabet ) # Close group

单词边界与单词的开头和结尾匹配。此处单词的定义是一系列字母,数字和下划线字符。

[[:<:]] 是开头的单词边界,因此在单词的开头匹配。

[[:>:]] 是开头的单词边界,因此在单词的末尾匹配。

在这里它们的使用保证了2(和数字/数字的部分)不被其他数字环绕(因此使21失败的例子)或算一个2,如果你有例如21/4是一种能够对两项罪名2的字符串秒。

MySQL 2022/1/1 18:53:29 有570人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶