找到正确的正则表达式

时间:2019-01-30 12:01:54

标签: php mysql regex categories

我有以下类别: 主要类别(猫):

  • 1
  • 2
  • ..
  • 15

Sub Cat示例:

对于主猫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 开头  应该返回:

  • 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 开头  应该返回:

  • 1.1.2
  • 1.1.3
  • 如果我做正则表达式,我会得到:

  • 1.1.2
  • 1.1.3
  • 1.11.2
  • (我不想要)


    查找类别以 2.1 开头  应该返回:

  • 2.1.2
  • 2.1.2.4
  • 如果我做正则表达式,我会得到:

  • 2.1.2
  • 2.1.2.4
  • 2.12.4
  • (我不想要)

    谢谢您的帮助:)

    3 个答案:

    答案 0 :(得分:0)

    我认为您根本不需要正则表达式,并且可能会使它复杂化。

    如果您知道要查找的类别,并假设用户正在请求“ 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.
    

    答案 1 :(得分:0)

    对于8.0.4之前的MySQL,您可以在正则表达式中使用单词边界标记([[:>:]])的结尾,以避免选择以.g开头的子类别。搜索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'
    

    答案 2 :(得分:0)

    对于主类别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。