使用REGEXP查找匹配字符串的MySQL查询未能正常工作

3

我正在使用MySQL 5.5

我有一个名为nutritions的表,其中包含一个带有text数据类型的列serving_data

serving_data列中的一些值如下:

[{"label":"1 3\/4 cups","unit":"3\/4 cups"},{"label":"1 cups","unit":"3\/4 cups"},{"label":"1 container (7 cups ea.)","unit":"3\/4 cups"}]

现在,我想查找包含像1 3\/4杯这样的serving_data记录。
为此,我已经做了一次查询,
SELECT id,`name`,`nutrition_data`,`serving_data`
FROM `nutritions` WHERE serving_data REGEXP '(\d\s\\\D\d\scup)+';

但似乎没有起作用。

我还尝试过

SELECT id,`name`,`nutrition_data`,`serving_data`
FROM `nutritions` WHERE serving_data REGEXP '/(\d\s\\\D\d\scup)+/g';

如果我在http://regexr.com/中使用相同的模式,看起来匹配成功了。
有人可以帮我吗?

\d替换为[0-9],将\D替换为[^0-9],将\s替换为[[:space:]]。尝试使用WHERE serving_data REGEXP '([0-9]+[[:space:]])?[0-9]+/[0-9]+[[:space:]]+cup';。请参阅https://regex101.com/r/sO8fL3/1。 - Wiktor Stribiżew
请勿使用/.../g,只使用模式。顺便问一下,字符串中是否真的有\?我相信没有\,对吗? - Wiktor Stribiżew
SELECT id,name,nutrition_data,serving_data FROM nutritions WHERE serving_data REGEXP '[0-9][[:space:]]/[^0-9][0-9][[:space:]]cup'; - 看起来不行。是的,字符串中有\ - Dev
似乎工作正常,但是像 [{"label":"1\/2 cup","unit":"cup"},{"label":"1 cup","unit":"cup"}] 这样的记录也会被该模式选中。我只想选择像 1 3\/4 cups 这样的记录与该模式匹配。 - Dev
然后删除?- [0-9]+[[:space:]][0-9]+\\\\/[0-9]+[[:space:]]+cup - Wiktor Stribiżew
显示剩余3条评论
1个回答

4
请注意,在 MySQL 的正则表达式中,不能使用类似 \d\D\s 的快捷字符类,需要用 [0-9][^0-9][[:space:]] 分别替换它们。
你可以使用:
REGEXP '[0-9]+[[:space:]][0-9]+\\\\/[0-9]+[[:space:]]+cup'

查看正则表达式演示(请注意,通常情况下,regex101.com不支持MySQL正则表达式语法,但PCRE选项支持POSIX字符类,例如[:digit:][:space:],因此这里仅用于演示,而非证明它可以与MySQL REGEXP一起使用)。 模式细节:
  • [0-9]+ - 一个或多个数字
  • [[:space:]] - 一个空格
  • [0-9]+- 一个或多个数字
  • \\\\/ - 一个字面上的\/字符序列
  • [0-9]+[[:space:]]+cup - 一个或多个数字,一个或多个空格,cup
请注意,您可以使用单词边界来精确指定单词cup,在其后添加[[:>:]]模式以匹配整个单词cup

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接