用于通配符查找的正则表达式帮助

时间:2016-03-29 18:05:32

标签: sql regex database psql

我遇到了这个通配符查询的问题,不知道为什么这不起作用:

我正在查找销售代理42的示例。正如您可以想象的那样,他们并不真正关心垃圾输出。所以他们的代理人代码通常是一堆乱七八糟的东西。

代理42的有效示例:

  • 42
  • 30-的 42 -22-假日
  • 42 复活节
  • 42 -coupon
  • 42 优惠券-423355
  • 29-的 42 出售-52

明确无需显示的非有效示例

  • A 42 900的 42
  • 42 97901
  • 42 cmowc209d
  • o203f9j的 42 PO0

这是我提出的最成功的模型:

SELECT company_id, agent
FROM cust_data
WHERE (agent = ('42') OR agent LIKE ('42%-%') OR agent LIKE ('%-%42') OR agent LIKE ('%-%42%-%') OR agent LIKE ('42[a-z]%-%') OR agent LIKE ('%-%42[a-z]%') OR agent LIKE ('%-%42[a-z]%-%') OR agent LIKE ('42[a-z]%'))

我得到了大部分有效的回复而且没有任何无效回复,但我似乎仍然无法抓住像 42 复活节或29- 42 <的例子/ strong> sale-52即使我告诉它要抓住那种风格......

有什么建议吗?

1 个答案:

答案 0 :(得分:1)

如果您需要匹配未被数字包围的42,您可以使用 anchors ^代替开始的替代字符串和$代表字符串结尾)和否定字符类

WHERE agent ~ '(^|[^0-9])42($|[^0-9])'

请参阅the regex demo

说明:

  • (^|[^0-9]) - 字符串^的开头或非数字[^0-9]
  • 42 - 文字42
  • ($|[^0-9]) - 结束字符串$或非数字[^0-9]