找到正确的正则表达式

Find the right Regex

我有这样的分类: 主要类别(猫):

子猫示例:

对于主要类别 1:

对于主要类别 2:

主猫 15 :

我想为 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.%' -- ButOR` 阻止使用索引。

    计划 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。