【问题标题】:Removing certain characters in all rows that match a regex?删除与正则表达式匹配的所有行中的某些字符?
【发布时间】:2012-07-01 18:00:33
【问题描述】:

我想改变

{foo, {bar}, foobar}

{foo, bar, foobar}

在与'{.*{' 匹配的所有行中。 IE。删除所有花括号 { 和 },除了最外面的一对。

这样做

mysql -h $H -u $U -p$P $DB -B -e "SELECT id FROM t WHERE col REGEXP '{.*{'" > bad.txt

选择需要此替换的所有行。如何快速进行这种替换?

编辑:

我可以这样做吗

update table set column = REPLACE(column,'{','');

然后恢复出最外的一对

update table set column = REPLACE(column,'^','{');

update table set column = REPLACE(column,'$','}');

我收到错误

mysql> EXPLAIN UPDATE t SET col=REPLACE(REPLACE(REPLACE(REPLACE(col,'{{','{'),'}}','}'), ', {', ', '), '}, ', ', ');
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'UPDATE t SET col=REPLACE(REPLACE(REPLACE(REPLACE(' at line 1

【问题讨论】:

标签: mysql sql regex replace


【解决方案1】:

我确信有一种更详细的方法可以一步完成,但快速的“脏”方法是删除所有 {},并在完成后包装整个集合。

UPDATE table
SET column = CONCAT('{', REPLACE(REPLACE(column,'{',''),'}',''), '}')
WHERE column REGEXP '{.*{'

【讨论】:

  • 这可能具有破坏(假设这是上面未完全引用的 json 数据)子对象的副作用,例如 { foo, bar: { a, b }, foobar }
  • 在这种情况下,我需要将{ foo, bar: { a, b }, foobar } 更改为{ foo, bar: a, b, foobar }
  • 如果你在 MySQL Workbench 中运行它,我会得到:SELECT CONCAT('{', REPLACE(REPLACE('{ foo, bar: { a, b }, foobar }','{',''),'}',''), '}') = '{ foo, bar: a, b , foobar }'
  • 它不会破坏子对象中的元素,但会在其周围留下额外的空白。如果您还需要正确的空格,您可以通过添加更多替换命令来清除它,同时考虑到'{ '' }'。但不会破坏任何数据。
【解决方案2】:

不幸的是 MySQL 不支持正则表达式中的反向引用(允许使用括号对子表达式进行分组并在同一表达式中调用它们匹配的值)。 您可以将 SELECT 查询的结果导出到文本文件(例如 CSV 格式)中,替换所有出现的

{(.*){(.*)}(.*)}

与:

\1\2\3

使用支持 Perl 正则表达式语法的文本编辑器,然后用修改后的行替换原始行。

注意这个查询:

UPDATE table
SET column = CONCAT('{', REPLACE(REPLACE(column,'{',''),'}',''), '}')
WHERE column REGEXP '{.*{'

只有在保证整个文本被一对大括号包裹的情况下才有效!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-31
    相关资源
    最近更新 更多