找到正确的正则表达式

问题描述 投票:-1回答:3

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

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

  • 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
  • (I don't want that)

    查找类别开始由1.1应该返回:

  • 1.1.2
  • 1.1.3
  • 如果我做我的正则表达式,我将有:

  • 1.1.2
  • 1.1.3
  • 1.11.2
  • (I don't want that)

    查找类别开始由2.1应该返回:

  • 2.1.2
  • 2.1.2.4
  • 如果我做我的正则表达式,我将有:

  • 2.1.2
  • 2.1.2.4
  • 2.12.4
  • (I don't want that)

    谢谢您的帮助 :)

    php mysql regex categories
    3个回答
    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.
    

    0
    投票

    对于MySQL之前8.0.4,可以使用字边界标记([[:>:]])的端部在正则表达式以避免选择的子类别与例如开始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'
    

    0
    投票

    对于主类别1:LIKE '1.%' 对于主要类别15:LIKE '15.%' 对于2.1类别:LIKE '2.1.%'

    此外,通过使用LIKE你可以利用INDEX(cat)以提高性能。

    但是......这可能是不够的。 (我声称,问题是这里含义模糊。)如果有可能只用'2.1'条目(无子子猫),那么那些喜欢是不够的。所以...

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

    © www.soinside.com 2019 - 2024. All rights reserved.