Mysql regexp匹配<year>,<year_0>,<year_1>标记中的相同子字符串

时间:2015-11-13 14:47:34

标签: mysql regex mariadb

问题:是否可以使用regexp匹配>*2014*</year子字符串,以便只有最近的>字符才能匹配。另一种说法是使用regexp来匹配>...XXXX...</year子字符串,但在子字符串匹配中不允许使用< char。

Mysql regexp查询选择year = 2014记录,但这会溢出开始结束标记>*2014*</year并返回额外的行。我相信它从之前的<start>2014-MM-DD</start>标记开始匹配。

Select * From table1 Where args REGEXP '>.*(2014).*<\/year'

我不使用'<year>.*(2014).*<\/year>'的原因是一年或多年,year_0,year_1标签等数组标签数量不受限制。我需要选择年份(包含)2014的任何行,无论哪个年份标记值

简化示例args列值,每行是一个单独的表行。标记值不仅仅是year (equals) 2014,还有any year (contains) 2014公式。

<title>Record 1</title><start>2014-01-31</start><year>text 2013 text</year><end>2014-02-17</end>
<title>Record 2</title><start>2014-01-03</start><year>any 2014 text</year><end>2014-01-26</end>
<title>Record 3</title><start>2014-03-07</start><year>aa 2015 bb</year><end>2014-03-12</end>
<title>Record 4m</title><start>2014-02-22</start><year>2014</year><year_0>like 2015 this</year_0><end>2014-03-01</end>
<title>Record 5m</title><start>2015-02-23</start><year>bb 2012 cc</year><year_0>2014 dd</year_0><year_1>2014</year_1><end>2015-03-02</end>
<title>Record 6m</title><start>2014-02-22</start><year>2013</year><year_0>like 2015 this</year_0><end>2014-03-01</end>
<title>Record 7m</title><year>2013</year><start>2014-02-22</start><year_0>like 2015 this</year_0><end>2014-03-01</end>

以下regex101.com online example显示溢出问题,我需要匹配年,year_0,year_1 等标签,而不仅仅是<year>标签。这不应该与记录匹配,因为年份有2013,2015个子串。

修改以下SqlFiddle online example显示溢出问题 any_year = 2014 匹配不正确的行,我需要匹配年份,年份_0,年份1,... 。仅限数组值。不应列出第7m行。

Edit2 最佳答案我认为到目前为止Where args REGEXP '<year[>_].*2014.*<\/year[>_]'是在一个正则表达式中查找年份值数组。

1 个答案:

答案 0 :(得分:2)

你只需要用反斜杠\/

来逃避斜杠

http://sqlfiddle.com/#!9/0bbb0/8

SELECT * 
FROM t1
WHERE args REGEXP '<year>.*2014.*<\/year>'

更新 http://sqlfiddle.com/#!9/0bbb0/9

SELECT * 
FROM t1
WHERE args REGEXP '<year.*>.*2014.*<\/year.*>'