MySQL正则表达式查询

MySQL正则表达式查询,mysql,regex,Mysql,Regex,我试图从具有以下结构的数据库中选择表中的所有行: <tr> <td> <p><strong>Completion Date:</strong></p> </td> <td> <p>April, 2012</p> </td> </tr> 完成日期: 2012年4月 但是月份和年份可能不同 以下是我当前的查询语句: SELECT * FROM `pos

我试图从具有以下结构的数据库中选择表中的所有行:

<tr>
<td>
<p><strong>Completion Date:</strong></p>
</td>
<td>
<p>April, 2012</p>
</td>
</tr>

完成日期:

2012年4月

但是月份和年份可能不同

以下是我当前的查询语句:

SELECT * FROM `posts` WHERE `content` REGEXP "<tr>\r\n<td>\r\n<p><strong>Completion Date:</strong></p>\r\n</td>\r\n<td>\r\n<p>April, 2012</p>\r\n</td>\r\n</tr>"
SELECT*FROM`posts`WHERE`content`REGEXP'\r\n\r\n完成日期:\r\n\r\n\r\n2012年4月

\r\n\r\n
目前,这只会拉到2012年4月的行,这是我期望它拉到的。我试着用:^[A-Za-z]$来代替这个月,但这不起作用,也没有任何其他组合

有人能帮我找到正确的正则表达式吗

谢谢


-M

这应该会给出您想要的结果。请注意您如何需要星号,它表示0个或更多
[a-zA-Z]
,以及0个或更多
[0-9]
字符

SELECT * FROM `posts` WHERE `content` REGEXP "<tr>\r\n<td>\r\n<p><strong>Completion Date:</strong></p>\r\n</td>\r\n<td>\r\n<p>[a-zA-Z]*, [0-9]*</p>\r\n</td>\r\n</tr>"
SELECT*FROM`posts`WHERE`content`REGEXP'\r\n\r\n完成日期:\r\n\r\n\r\n[a-zA-Z]*,[0-9]*

\r\n\r\n
插入符号
^
和美元符号
$
匹配字符串的开头和结尾。由于日期不在开头,因此这些日期与您的日期不匹配


祝你好运。

这会给出你想要的结果。请注意您如何需要星号,它表示0个或更多
[a-zA-Z]
,以及0个或更多
[0-9]
字符

SELECT * FROM `posts` WHERE `content` REGEXP "<tr>\r\n<td>\r\n<p><strong>Completion Date:</strong></p>\r\n</td>\r\n<td>\r\n<p>[a-zA-Z]*, [0-9]*</p>\r\n</td>\r\n</tr>"
SELECT*FROM`posts`WHERE`content`REGEXP'\r\n\r\n完成日期:\r\n\r\n\r\n[a-zA-Z]*,[0-9]*

\r\n\r\n
插入符号
^
和美元符号
$
匹配字符串的开头和结尾。由于日期不在开头,因此这些日期与您的日期不匹配


祝你好运。

^[A-Za-z]$
将匹配一行中的单个字母字符(
^
表示字符串的开头,
$
表示字符串的结尾)

您可能会更幸运地使用以下内容:
[A-Z][A-Z]*,\s*[0-9]{4}
。解释:

  • [A-Z]
    -1个大写字母
  • [a-z]*
    -任意数量的小写字母(包括其中的0个)
  • -逗号
  • \s*
    -任意数量的空格(包括其中的0个)
  • [0-9]{4}
    -正好是4位数字

^[A-Za-z]$
将匹配一行中的单个字母字符(
^
表示字符串的开头,
$
表示字符串的结尾)

您可能会更幸运地使用以下内容:
[A-Z][A-Z]*,\s*[0-9]{4}
。解释:

  • [A-Z]
    -1个大写字母
  • [a-z]*
    -任意数量的小写字母(包括其中的0个)
  • -逗号
  • \s*
    -任意数量的空格(包括其中的0个)
  • [0-9]{4}
    -正好是4位数字

如果只是月份和年份,您可以:

[a-zA-Z]+,\d{4}

当然,这将需要任何单词和任何4位数的年份。如果要添加更多支票,可以:

(一月|二月|三月|四月|五月|六月|七月|八月|九月|十月|十一月|十二月),(19 | 20){2}


这个新的正则表达式将匹配可能的有效月份,并检查年份是19xx还是20xx。

如果只是月份和年份,您可以执行以下操作:

[a-zA-Z]+,\d{4}

当然,这将需要任何单词和任何4位数的年份。如果要添加更多支票,可以:

(一月|二月|三月|四月|五月|六月|七月|八月|九月|十月|十一月|十二月),(19 | 20){2}


这个新的正则表达式将从可能的有效月份开始匹配,并检查年份是19xx年还是20xx年。

使用[A-Za-z]*不带卡雷特和美元符号来匹配它。我知道这不是答案,但EWW!这是在数据库中存储数据的可怕方式。使用[a-Za-z]*而不使用卡雷特和美元符号来匹配它。我知道这不是一个答案,但是EWW!在数据库中存储数据是一种可怕的方式。哦,我觉得很有趣!谢谢是的,问号不属于那里;我已编辑答案以删除它们。(在PCRE风格的regexp中,
*?
*
的意思相同,只是它试图匹配尽可能少的字符,但据我所知,它不支持这种非贪婪匹配。无论如何,即使它起作用,在这里也不会有什么区别。)啊,我一直习惯于在perl风格中使用非贪婪*匹配。谢谢你的信息。哦,我觉得很有趣!谢谢是的,问号不属于那里;我已编辑答案以删除它们。(在PCRE风格的regexp中,
*?
*
的意思相同,只是它试图匹配尽可能少的字符,但据我所知,它不支持这种非贪婪匹配。无论如何,即使它起作用,在这里也不会有什么区别。)啊,我一直习惯于在perl风格中使用非贪婪*匹配。谢谢你的信息。