regexp模式来匹配不同类型的数据

gev0vcfq  于 2021-06-21  发布在  Mysql
关注(0)|答案(2)|浏览(303)

我有一个数据库(mysql)文本字段,包含不同的数据:
data1-单个数字,用逗号分隔:1,2,3,4,5,6,7,8,9,10,11,12,13,14,15…n(其中n可以是任何正整数)
数据2-文本,用逗号分隔:lorem ipsum、dolor、sit amet、Concetetur、Adipising、elit、ut et、sollicitudin、enim、vel、Concetetur lacus
数据中不允许使用起始和结束逗号,空格可以位于逗号的前面和/或开头,也可以位于逗号的后面,例如2、3、4、5、6、7或lorem ipsum、dolor、sit amet等。这些空格现在可以在匹配中计算。
我需要用几种不同的方法来搜索这些数据,所以我需要regexp模式用于搜索:
模式a:匹配数据1中的数字。如果我搜索1,结果是,我只需要1,而不是11,12,等等。,
现在我有: [0-9]+(,[0-9]+)* 模式b:匹配一系列数字:如果字段包含两个给定数字之间的数字(至少一个)。
模式c:匹配数据2中由COMA分隔的完整字符串之一。比如:如果我搜索sit,我没有结果,但是如果我搜索sit amet,我得到结果。
有人能帮我拿这些吗?我为模式a准备的是最好的方法吗?如何匹配范围(模式b)和逗号分隔的字符串(模式c)?

fcg9iug3

fcg9iug31#

你不需要正则表达式。
我将向您展示一个技巧,使用mysql数字生成器和嵌套的子字符串索引函数相结合。
如果您需要支持更多csv,请添加一个新的

CROSS JOIN (
      SELECT 0 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9
    ) AS record_[number]

查询
此查询将生成从1到100的数字。因此,最终的查询最多可以支持100个分隔的值。

SELECT 
 (@number  := @number + 1) AS number
FROM (
  SELECT 0 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9
) AS record_1
CROSS JOIN (
  SELECT 0 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9
) AS record_2
CROSS JOIN ( SELECT @number := 0 ) AS init_user_param

请参见演示http://sqlfiddle.com/#!9/c314ca/5型
现在我们将从逗号分隔的字符串中提取值
查询
将[position]替换为0-。。。要从逗号分隔的字符串中提取的值。

SELECT SUBSTRING_INDEX(SUBSTRING_INDEX('1,2,3,4,5,6,7,8,9,10,11,12,13,14,15', ',', [position]), ',', -1) AS split;

或者

SELECT SUBSTRING_INDEX(SUBSTRING_INDEX('Lorem ipsum, dolor, sit amet, consectetur, adipiscing,elit, Ut et, sollicitudin, enim, vel, consectetur lacus ', ',', [position]), ',', -1) AS split;

请参见演示http://sqlfiddle.com/#!9/c314ca/16型
现在我们知道了将这两个查询组合到一个工作解决方案的基础知识。
此查询将所有逗号分隔的值转换为记录。
因为我不知道我的table结构á我想大概是

CREATE TABLE [name] (
    data1 TEXT
  , data2 TEXT
);

查询

SELECT
  DISTINCT 
      SUBSTRING_INDEX(SUBSTRING_INDEX(data1, ',', generator.number), ',', -1) AS split
FROM (

  SELECT 
   (@number  := @number + 1) AS number
  FROM (
    SELECT 0 UNION SELECT 1 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9
  ) AS record_1
  CROSS JOIN (
    SELECT 0 UNION SELECT 1 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9
  ) AS record_2
  CROSS JOIN ( SELECT @number := 0 ) AS init_user_param
) 
 AS generator
CROSS JOIN
 Table1

UNION ALL 

SELECT
  DISTINCT 
      SUBSTRING_INDEX(SUBSTRING_INDEX(data2, ',', generator.number), ',', -1) AS split
FROM (

  SELECT 
   (@number2  := @number2 + 1) AS number
  FROM (
    SELECT 0 UNION SELECT 1 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9
  ) AS record_1
  CROSS JOIN (
    SELECT 0 UNION SELECT 1 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9
  ) AS record_2
  CROSS JOIN ( SELECT @number2 := 0 ) AS init_user_param
) 
 AS generator
CROSS JOIN
 Table1

请参见演示http://sqlfiddle.com/#!9/a19fc5/6型
我们把它分成几个小部分。
模式a:匹配数据1中的数字。如果我搜索1,结果是,我只需要1,而不是11,12,等等。,
因为我们现在有记录而不是逗号分隔的值,所以我们可以简单地使用最后一个查询作为传递表来添加where子句。
请参见演示http://sqlfiddle.com/#!9/a19fc5/10号
模式b:匹配一系列数字:如果字段包含两个给定数字之间的数字(至少一个)。
where子句是一个简单的between子句
请参见演示http://sqlfiddle.com/#!2011年9月19日
模式c:匹配数据2中由COMA分隔的完整字符串之一。比如:如果我搜索sit,我没有结果,但是如果我搜索sit amet,我得到结果。
现在你可以用
请参见演示http://sqlfiddle.com/#!2014年9月19日

ttp71kqs

ttp71kqs2#

模式a:在commalist中搜索数字:

WHERE FIELD(1, '1,2,3,4,5,6,7,8,9,10,11,12,13')

WHERE '1,2,3,4,5,6,7,8,9,10,11,12,13' REGEXP '[[:<:]]1[[:>:]]'

这将检查“1”是否被“单词边界”包围。
模式b:不容易。
模式c:

WHERE CONCAT(',', 'dolor, sit amet, etc', ',') REGEXP ', *sit amet *,';

这会加上逗号,然后检查单词是否有空格包围,然后一定要加逗号。

相关问题