找到正确的正则表达式
Find the right Regex
我有这样的分类:
主要类别(猫):
- 1
- 2
- ..
- 15
子猫示例:
对于主要类别 1:
- 1.1.2
- 1.1.3
- 1.2
- 1.11.2
对于主要类别 2:
- 2.1.2
- 2.1.2.4
- 2.12.4
主猫 15 :
- 15.11.12
我想为 MYSQL 查找以类别.
开头的类别的正则表达式
例如(上面的例子):
查找以 1 开头的类别
应该 Return :
1.1.2
1.1.3
1.2
1.11.2
如果我做正则表达式,我会得到:
1.1.2
1.1.3
1.2
1.11.2
15.11.12 (我不要那个)
查找以 1.1 开头的类别
应该 Return :
1.1.2
1.1.3
如果我做正则表达式,我会得到:
1.1.2
1.1.3
1.11.2 (我不要那个)
查找以 2.1 开头的类别
应该 Return :
2.1.2
2.1.2.4
如果我做正则表达式,我会得到:
2.1.2
2.1.2.4
2.12.4 (我不想要那个)
感谢您的帮助:)
我认为您根本不需要正则表达式,可能会使它过于复杂。
如果您知道要查找哪个类别,假设用户正在请求“1.1”部分或“1.2”或“1.4.1”部分,那么您可以使用通配符进行搜索。
您没有提及此数据是存储为小数还是 varchar,所以我猜它是 varchar,只是因为在我见过的大多数数据库中,它们总是以这种方式存储。
因此,如果类别是 1.1,而您想要 1.1.0、1.1.1、1.1.12 等,您只需搜索与 1.1.% 匹配的任何内容,这意味着搜索 1.1 后跟一个点的任何内容并且后面没有直接跟数字。
查询示例:
$category = "1.1";
$sql = "SELECT * FROM [your_table] WHERE cat LIKE '".$category.".%'";
此查询将匹配:
1.1.0
1.1.1
1.1.15
// Any anything else starting with 1.1.
对于 8.0.4 之前的 MySQL,您可以在正则表达式中使用单词边界标记的结尾 ([[:>:]]
) 以避免选择以例如开头的子类别。 2.12
当您搜索 2.1
时。尝试这样的事情:
SELECT *
FROM yourtable
WHERE category RLIKE '^2.1[[:>:]]'
对于MySQL 8.0.4及以后的版本,它支持\b
作为单词边界,你可以使用它来代替(注意需要将\
复制为MySQL 将其解释为字符串中的转义字符):
SELECT *
FROM yourtable
WHERE category RLIKE '^2.1\b'
对于主要类别 1:LIKE '1.%'
对于主要类别 15:LIKE '15.%'
对于类别 2.1:LIKE '2.1.%'
此外,通过使用 LIKE
您可以利用 INDEX(cat)
来提高性能。
但是... 这可能还不够。 (而且我声称这里的问题含糊不清。)如果可以有一个只有 '2.1'
的条目(没有子子猫),那么这些 LIKE 是不够的。所以...
方案 A:col REGEXP '^2[.]1([.]|$)'
-- 但是 REGEXP
不会使用任何索引。
B 计划:col = '2.1' OR col LIKE '2.1.%' -- But
OR` 阻止使用索引。
计划 C:笨拙,但对于大型数据集最快(由于索引):
WHERE col LIKE '2.1%' -- uses INDEX(col) for quick filtering
AND col REGEXP '^2[.]1([.]|$)' -- avoids "2.15" and other things
为什么 .
周围有括号?:
.
本身匹配任何一个字符——不需要那个
[.]
匹配任何一组字符,包括句点
\.
匹配句点,但根据上下文,您可能需要 1 或 2 或 4 个反斜杠。
底线:为简单起见,使用计划 B。为了性能,使用计划 C。
我有这样的分类: 主要类别(猫):
- 1
- 2
- ..
- 15
子猫示例:
对于主要类别 1:
- 1.1.2
- 1.1.3
- 1.2
- 1.11.2
对于主要类别 2:
- 2.1.2
- 2.1.2.4
- 2.12.4
主猫 15 :
- 15.11.12
我想为 MYSQL 查找以类别.
开头的类别的正则表达式例如(上面的例子):
查找以 1 开头的类别 应该 Return :
如果我做正则表达式,我会得到:
查找以 1.1 开头的类别 应该 Return :
如果我做正则表达式,我会得到:
查找以 2.1 开头的类别 应该 Return :
如果我做正则表达式,我会得到:
感谢您的帮助:)
我认为您根本不需要正则表达式,可能会使它过于复杂。
如果您知道要查找哪个类别,假设用户正在请求“1.1”部分或“1.2”或“1.4.1”部分,那么您可以使用通配符进行搜索。
您没有提及此数据是存储为小数还是 varchar,所以我猜它是 varchar,只是因为在我见过的大多数数据库中,它们总是以这种方式存储。
因此,如果类别是 1.1,而您想要 1.1.0、1.1.1、1.1.12 等,您只需搜索与 1.1.% 匹配的任何内容,这意味着搜索 1.1 后跟一个点的任何内容并且后面没有直接跟数字。
查询示例:
$category = "1.1";
$sql = "SELECT * FROM [your_table] WHERE cat LIKE '".$category.".%'";
此查询将匹配:
1.1.0
1.1.1
1.1.15
// Any anything else starting with 1.1.
对于 8.0.4 之前的 MySQL,您可以在正则表达式中使用单词边界标记的结尾 ([[:>:]]
) 以避免选择以例如开头的子类别。 2.12
当您搜索 2.1
时。尝试这样的事情:
SELECT *
FROM yourtable
WHERE category RLIKE '^2.1[[:>:]]'
对于MySQL 8.0.4及以后的版本,它支持\b
作为单词边界,你可以使用它来代替(注意需要将\
复制为MySQL 将其解释为字符串中的转义字符):
SELECT *
FROM yourtable
WHERE category RLIKE '^2.1\b'
对于主要类别 1:LIKE '1.%'
对于主要类别 15:LIKE '15.%'
对于类别 2.1:LIKE '2.1.%'
此外,通过使用 LIKE
您可以利用 INDEX(cat)
来提高性能。
但是... 这可能还不够。 (而且我声称这里的问题含糊不清。)如果可以有一个只有 '2.1'
的条目(没有子子猫),那么这些 LIKE 是不够的。所以...
方案 A:col REGEXP '^2[.]1([.]|$)'
-- 但是 REGEXP
不会使用任何索引。
B 计划:col = '2.1' OR col LIKE '2.1.%' -- But
OR` 阻止使用索引。
计划 C:笨拙,但对于大型数据集最快(由于索引):
WHERE col LIKE '2.1%' -- uses INDEX(col) for quick filtering
AND col REGEXP '^2[.]1([.]|$)' -- avoids "2.15" and other things
为什么 .
周围有括号?:
.
本身匹配任何一个字符——不需要那个[.]
匹配任何一组字符,包括句点\.
匹配句点,但根据上下文,您可能需要 1 或 2 或 4 个反斜杠。
底线:为简单起见,使用计划 B。为了性能,使用计划 C。