Richard Ellerbrock via discuss <[email protected]> writes:

> I am trying to understand the behaviour of REGEXP_REPLACE when there is a
> backslash in the subject string. It appears that the subject needs to have
> \'s escaped which is not desirable (see example 1 below). I can understand

This is the behaviour of string litterals in mariadb (quoted string
constants), it is not related to REGEXP_REPLACE. From the documentation:

  https://mariadb.com/kb/en/string-literals/

  "Backslash (\), if not used as an escape character, must always be
   escaped. When followed by a character that is not in the above table,
   backslashes will simply be ignored."

But it's possible to set NO_BACKSLASH_ESCAPES in the @@sql_mode, then
backslash needs not be escaped:

  MariaDB [knielsen]> select 'A\BC';
  | ABC |

  MariaDB [knielsen]> select 'A\\BC';
  | A\BC |

  MariaDB [knielsen]> set session sql_mode=no_backslash_escapes;
  MariaDB [knielsen]> select 'A\BC';
  | A\BC |

  MariaDB [knielsen]> select 'A\\BC';
  | A\\BC |

Because of the need to escape backslash in the string litterals, you need
double backslash (when no_backslash_escapes is not set) to escape specials
in the regexp:

  MariaDB [knielsen]> select regexp_replace('a.b', '\.', '!');
  | !!!                              |

  MariaDB [knielsen]> select regexp_replace('a.b', '\\.', '!');
  | a!b                               |

Remeber that this is the behaviour of the SQL parser when it parses a string
litteral. If the subject or regexp in REGEXP_REPLACE comes from a table
column or prepared-statement placeholder, or anywhere else the value is not
parsed as a string litteral, the backslash should not be escaped.

 - Kristian.
_______________________________________________
discuss mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to