【问题标题】:MySQL regex to match and not match multiple expressions regardless of orderMySQL正则表达式匹配和不匹配多个表达式,无论顺序如何
【发布时间】:2019-08-25 14:28:40
【问题描述】:

我需要一个正则表达式来匹配以下 3 个输入字符串:

serviceType=SALE&propertyType=HOUSE&city=1
propertyType=HOUSE&serviceType=SALE&city=1
city=1&propertyType=HOUSE&serviceType=SALE
city=1&serviceType=SALE&propertyType=HOUSE
serviceType=SALE&propertyType=HOUSE
serviceType=SALE

不匹配

serviceType=SALE&propertyType=HOUSE&city=2
propertyType=HOUSE&city=2&serviceType=SALE
city=2&propertyType=HOUSE&serviceType=SALE
serviceType=SALE&propertyType=FARM&city=1
serviceType=SALE&propertyType=UNIT
serviceType=RENTAL&propertyType=HOUSE
serviceType=RENTAL

我尝试了以下匹配第一个输入字符串但无法弄清楚其余部分的内容:

(?=.*serviceType=SALE)(?=.*propertyType=HOUSE)(?=.*city=1)

【问题讨论】:

    标签: regex regex-lookarounds


    【解决方案1】:

    您似乎正在寻找这样的东西:

    ^serviceType=SALE(?:&propertyType=HOUSE(?:&city=1)?)?$
    

    请参阅here 以获取演示

    编辑

    如果参数的顺序不重要,那么使用这个正则表达式:

    ^(?:(?:&|^)(?:serviceType=SALE|propertyType=HOUSE|city=1)){1,3}$
    

    表示“一个&或字符串的开头(^),后面跟三个参数中的任意一个,都重复1到3次。

    查看新的demo

    如果您在 URL 中搜索此模式,我想您应该将最初的 ^ 替换为 (?:^|(?<=\?)) 以说明该字符串也可以以问号开头。

    【讨论】:

    • 嗨@horcrux,不幸的是,上面的正则表达式在 MySQL 中不起作用。我得到的错误是“从正则表达式中得到错误'重复运算符操作数无效'”。原因在here详细解释。你能帮忙吗?
    • 上述正则表达式中没有惰性运算符。我猜你只需要删除?:
    • 感谢@horcrux,我已经检查了从搜索中选择查询的模式 where s.query regexp '^((&|^)(serviceType=SALE|propertyType=HOUSE|city=1) ){1,3}$' 在正则表达式测试器中仍然有效,但在 MySQL 中不返回匹配项。你觉得有什么问题吗?
    • 我没有看到任何错误。您确定输入类似于serviceType=SALE&propertyType=HOUSE&city=1 还是完整的网址?请注意,如果字符串附近有其他字符,则此正则表达式将不起作用。
    • 一切都好,这是我的错。我将代码直接复制/粘贴到表字段而不是运行插入语句。一切都很好,工作正常。再次感谢@horcrux
    猜你喜欢
    • 2014-11-03
    • 1970-01-01
    • 2012-06-17
    • 1970-01-01
    • 1970-01-01
    • 2012-10-08
    • 1970-01-01
    • 2021-12-31
    • 1970-01-01
    相关资源
    最近更新 更多