1
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

mysql8で追加された正規表現の関数を勉強してみた

Last updated at Posted at 2020-06-21

私はmysql初心者です。間違いなどありましたら、教えていただけるとありがたいです。

参考
https://dev.mysql.com/doc/refman/8.0/en/regexp.html

これらが8で追加されました

  • REGEXP_LIKE()
  • REGEXP_SUBSTR()
  • REGEXP_REPLACE()
  • REGEXP_INSTR()

REGEXP_LIKE(expr, pat[, match_type])

  • 文字列exprpatで指定された正規表現と一致すると1を返し、一致していなかったら0を返す
  • expr または pat が NULL の場合、戻り値は NULL

match_type

  • c: 大文字小文字を区別する
  • i: 大文字小文字を区別しない
  • m: 複数行モード、デフォルトだと文字列の最初と最後のみが^$などに一致するが、これを指定すると\nの前後も行の最初と最後として扱ってくれる
  • n: 行の終端に.がマッチする
  • u: unixの行末のみにする、\nは行末として扱われて\r\nは扱われないようす

矛盾するオプションは右側が優先される。ciだったらiが有効になる。

select
  regexp_like('abc', '[a-z]{3}') 一致
  ,regexp_like('ab', '[a-z]{3}') 不一致;

Screen Shot 2020-06-22 at 0.50.38.png

select
  regexp_like('ABC', '[a-z]{3}', 'c') c大文字小文字区別する
  ,regexp_like('ABC', '[a-z]{3}', 'i') i大文字小文字区別しない
  ,regexp_like('aaa\nbbb', 'a$') mなし
  ,regexp_like('aaa\nbbb', '^b') mなし
  ,regexp_like('aaa\nbbb', 'a$', 'm') mあり
  ,regexp_like('aaa\nbbb', '^b', 'm') mあり
  ,regexp_like('a\nb', '...') nなし
  ,regexp_like('a\nb', '...', 'n') nあり
  ,regexp_like('a\r\nb', 'a$', 'm') uなしCRLF
  ,regexp_like('a\r\nb', 'a$', 'mu') uありCRLF
  ,regexp_like('a\nb', 'a$', 'm') uなしLF
  ,regexp_like('a\nb', 'a$', 'mu') uありLF;

Screen Shot 2020-06-22 at 0.59.30.png

REGEXP_SUBSTR(expr, pat[, pos[, occurrence[, match_type]]])

  • 文字列exprpatで指定された部分文字列を返す
  • expr または pat が NULL の場合、戻り値は NULL
  • pos: 検索開始位置。デフォルトは1
  • occurrence: 例えば3を指定したら3回目に出現した部分。デフォルトは1
  • match_type: REGEXP_LIKEの説明と同じ
select 
  regexp_substr('abc def ghi', '[a-z]+') デフォルト
  ,regexp_substr('abc def ghi', '[a-z]+', 1) 1文字目から検索
  ,regexp_substr('abc def ghi', '[a-z]+', 5) 5文字目から検索
  ,regexp_substr('abc def ghi', '[a-z]+', 9) 9文字目から検索
  ,regexp_substr('abc def ghi', '[a-z]+', 1, 1) 1回目に出現
  ,regexp_substr('abc def ghi', '[a-z]+', 1, 2) 2回目に出現
  ,regexp_substr('abc def ghi', '[a-z]+', 1, 3) 3回目に出現

Screen Shot 2020-06-22 at 1.07.47.png

REGEXP_REPLACE(expr, pat, repl[, pos[, occurrence[, match_type]]])

  • exprの中で、patで指定された正規表現に一致する文字列を置換文字列 repl で置換し、その結果の文字列を返す
  • expr または pat または repl が NULL の場合、戻り値は NULL
  • pos: T検索開始位置。デフォルトは1
  • occurrence: 例えば3を指定したら3回目に出現した部分のみ置換。デフォルトは0(0を指定すると一致する文字全て置換)
  • match_type: REGEXP_LIKEの説明と同じ
select 
  regexp_replace('abc def ghi', '[a-z]+', 'xxx') デフォルト
  ,regexp_replace('abc def ghi', '[a-z]+', 'xxx', 1) 1文字目から検索
  ,regexp_replace('abc def ghi', '[a-z]+', 'xxx', 5) 5文字目から検索
  ,regexp_replace('abc def ghi', '[a-z]+', 'xxx', 9) 9文字目から検索
  ,regexp_replace('abc def ghi', '[a-z]+', 'xxx', 1, 0) 0は全て置換
  ,regexp_replace('abc def ghi', '[a-z]+', 'xxx', 1, 1) 1回目を置換
  ,regexp_replace('abc def ghi', '[a-z]+', 'xxx', 1, 2) 2回目を置換
  ,regexp_replace('abc def ghi', '[a-z]+', 'xxx', 1, 3) 3回目を置換

Screen Shot 2020-06-22 at 1.14.54.png

REGEXP_INSTR(expr, pat[, pos[, occurrence[, return_option[, match_type]]]])

  • patで指定された正規表現に一致するexprの開始インデックスを返す
  • expr または pat が NULL の場合、戻り値は NULL
  • 文字インデックスは 1 から
  • pos: 検索開始位置。デフォルトは1
  • occurrence: 例えば3を指定したら3回目に出現した部分。デフォルトは1
  • return_option: 0を指定した場合、ッチした部分文字列の最初の文字の位置を返す。1を指定した場合、マッチした部分文字列の後の位置を返す。省略した場合、デフォルトは0
select 
  regexp_instr('abc def ghi', '[a-z]{3}') デフォルト
  ,regexp_instr('abc def ghi', '[a-z]{3}', 1) 1文字目から
  ,regexp_instr('abc def ghi', '[a-z]{3}', 2) 5文字目から
  ,regexp_instr('abc def ghi', '[a-z]{3}', 7) 9文字目から
  ,regexp_instr('abc def ghi', '[a-z]{3}', 1, 1) 1回目に出現
  ,regexp_instr('abc def ghi', '[a-z]{3}', 1, 2) 2回目に出現
  ,regexp_instr('abc def ghi', '[a-z]{3}', 1, 3) 3回目に出現
  ,regexp_instr('abc def ghi', '[a-z]{3}', 1, 1, 0) 一致した位置
  ,regexp_instr('abc def ghi', '[a-z]{3}', 1, 1, 1) 一致した後の位置

Screen Shot 2020-06-22 at 1.23.15.png

見ていただいてありがとうございましたm(_ _)m

1
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?