【问题标题】:regexp_replace() - matches but does not replace at end of lineregexp_replace() - 匹配但不在行尾替换
【发布时间】:2019-02-21 04:01:30
【问题描述】:

我正在尝试通过添加“/”来regexp_replace() 以不带“/”结尾的列的所有值。

我可以通过使用这个语句得到正确的值(模式是用 PCRE 检查器测试的):

SELECT * FROM `table` WHERE `column` REGEXP("(?<=[^\/])$");

还有不匹配的:

SELECT * FROM `table` WHERE `column` REGEXP("(?<![^\/])$");

但是当语句是:

UPDATE `table` SET `column` = REGEXP_REPLACE(`column`, "(?<=[^\/])$", "/");

那么,不管我在第三个参数中设置什么值,都没有变化:

Query OK, 0 rows affected (0.00 sec)
Rows matched: 1031  Changed: 0  Warnings: 0

【问题讨论】:

  • 你试过类似REGEXP_REPLACE(`column`, "^(.*[^/])$", "\\1/")的东西吗?

标签: regex replace mariadb pcre


【解决方案1】:

试图理解为什么它不起作用

当我合理化问题时,您要求REGEXP_REPLACE 做两件事:

  • 发现缺少某些东西,然后
  • 指向字符串中的某个位置。

你的正则表达式说它丢失了,但我怀疑它是否指向一个特定的子字符串(甚至是一个空的)来替换。很容易指向 found 子字符串(或子字符串)。很难指向 missing 子字符串。并且需要这样一个“指针”来进行替换。

因此,Michal 的方法(即使需要一些正则表达式)是解决问题的“正确”方法。

【讨论】:

    【解决方案2】:

    没有正则表达式你可以轻松做到这一点:

    UPDATE `table` SET `column` = `column` + '/'
    WHERE RIGHT(`column`, 1) <> '/'
    

    【讨论】:

    • 我经常使用 regexp_replace(),所以我试图理解为什么它不起作用。无论如何,感谢您的工作解决方案!
    猜你喜欢
    • 2011-06-30
    • 2022-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多