【问题标题】:MySQL Regex If string contains hyphen after 5 digitsMySQL Regex 如果字符串在 5 位数字后包含连字符
【发布时间】:2019-11-13 23:46:24
【问题描述】:

所以我的表中有一个 slug 列,由于一些错误的编码,我的一些 slug 被搞砸了,需要修复。

我需要在字符串中间的某个位置找到所有在两边正好有 5 位数字的连字符的 slug。

所以这里有三个蛞蝓样本:

321-sw-2nd-ave-portland-or-97204-2-3-4-5
321-sw-2nd-ave-portland-or-97204-2-3
430-e-25th-st-tacoma-wa-98421

我的表达式会匹配第一个和第二个,但不匹配第三个。

然后我想去掉邮政编码后的那些多余的东西。

这是我迄今为止尝试过的,但我的正则表达式技能缺乏大量时间。

^(.)*d{5}-(.)*$

【问题讨论】:

  • 哪个版本的 MySQL? 8.0 更改了正则表达式。
  • 您需要提取蛞蝓吗?还是只识别具有“slug+hyphen”的行?

标签: mysql sql regex string


【解决方案1】:

您正在尝试匹配整个字符串。我只想对您感兴趣的部分进行部分匹配。您的正则表达式的另一个问题是您使用d 来表示一个数字:MySQL 想要\\d;此外,此表示法仅从 8.0 开始支持(在早期版本中,您需要 [0-9])。

考虑:

slug RLIKE '[0-9]{5}-'

Demo on DB Fiddle

with t as (
    select '321-sw-2nd-ave-portland-or-97204-2-3-4-5' slug
    union all select '321-sw-2nd-ave-portland-or-97204-2-3'
    union all select '430-e-25th-st-tacoma-wa-98421'
)
select slug from t where slug RLIKE '[0-9]{5}-'
|蛞蝓 | | :---------------------------------------------------- | | 321-sw-2nd-ave-portland-or-97204-2-3-4-5 | | 321-sw-2nd-ave-portland-or-97204-2-3 |

【讨论】:

  • 这不起作用,因为有时地址也可以以 5 位数字开头。对不起,我应该提到这一点。所以该表达式也将匹配这个:15645-eastlake-parade-kingston-act-2604。但是也许slug RLIKE '-[0-9]{5}-' 会起作用。
  • @zen:是的,-[0-9]{5}- 应该可以解决这个问题:参见this fiddle
猜你喜欢
  • 2012-06-13
  • 1970-01-01
  • 1970-01-01
  • 2013-12-07
  • 2022-08-19
  • 2017-10-19
  • 2019-03-15
  • 1970-01-01
  • 2020-02-14
相关资源
最近更新 更多