【问题标题】:Regexp - Search for start of words正则表达式 - 搜索词的开头
【发布时间】:2012-02-23 00:55:21
【问题描述】:

您好,我正在建立一个网站并按名称搜索地名。我需要一个正则表达式来匹配以下情况....

Search = Lon

Matches
Londonderry
Greater London

But no match in
Millon

我试过“^Lon”,但这并没有显示大伦敦,

我只尝试了 'Lon' 但这与 Millon 匹配,

我也弄乱了单词边界,但无法正常工作。 我确信这很简单,但正则表达式在经典上很棘手。

【问题讨论】:

  • 我对如何在正则表达式中进行处理有一些想法,但要么它们太笼统,要么带回“millon”或跳过“Greater London”......
  • (^SEARCH|\bSEARCH) - 不起作用

标签: mysql regex search


【解决方案1】:

在 MySQL 中,您可以使用 [[:<:]][[:>:]] 在 Regexp 中标记单词边界。

所以这应该在你的 WHERE 子句中起作用:

regexp '[[:<:]]Lon'

例如:

select * from articles where lower(title) like '[[:<:]]lon'

MySQL Regexp Manual

注意:关于性能问题,您应该听取@gbn 的建议。

【讨论】:

  • 哦,有趣。根据 RegexBuddy 的说法,MySQL 不支持单词边界——很高兴听到它支持。我会立即通知 RegexBuddy 的开发人员,以便他解决此问题。
  • @Tim 我也不知道它有 :)。刚刚查看了手册,寻找这个问题的可能答案,找到它,尝试它,它有效。
  • 你是一个可怕的传奇......我昨晚用 mysql regexp 摸索了几个小时......完全按照它在锡上所说的效果
  • @PhilPoore:和我的 LIKE 做一些比较。使用正则表达式时,您将获得相同的性能(或稍差)。
  • 从技术上讲你没有传奇,我很确定你必须死才能成为传奇......我只是真的很喜欢建议/帮助......我确实阅读了 mysql 手册并试图找到我对正则表达式的了解最多,但真的谁能说他们完全理解正则表达式(例如 ^M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3 })(IX|IV|V?I{0,3})$) 和特别是 mysql 版本....缩放接缝很好...我在每行 4 个字段的 200000 条记录上使用它,它返回在 200 毫秒内......如果情况变得更糟,我会提前处理数据
【解决方案2】:

你可以用 LIKE 做到这一点

WHERE MyCol LIKE 'Lon%' OR MyCol  LIKE '% Lon%'

但是,由于前导通配符,这不会很好地扩展。正则表达式也有同样的问题。

您需要将full text search 与词干一起使用(目前只有 MyISAM 用于 5.5)才能进行任何可扩展的操作。

【讨论】:

  • 如果可以的话,我宁愿不使用它,因为你说它不能很好地扩展,表已经有 200,000 行......
  • @PhilPoore:正如我所说,您需要使用全文搜索。正如另一个答案所说,REGEX 也不会扩展。
【解决方案3】:

使用[[:&lt;:]]Lon[[:&lt;:]] 匹配 MySQL 正则表达式中的零宽度字边界。

>
var input = ["Million", "Londonderry", "Greater London"];
for(var i = 0; i < input.length; i++){
    console.log(/[[:<:]]lon/i.test(input[i]));
}

> false
> true
> true

编辑

显然是MySQL dosn't support \b 并改用[[:&lt;:]]

【讨论】:

  • MySQL的正则表达式实现真的不支持\b!?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-13
  • 1970-01-01
  • 1970-01-01
  • 2018-02-21
  • 2020-01-25
  • 2012-03-10
  • 1970-01-01
相关资源
最近更新 更多