MySQL | REGEXP_INSTR method
Start your free 7-days trial now!
MySQL's REGEXP_INSTR(~)
method returns the starting index of the substring matching the regular expression pat
.
Parameters
1. expr
| string
The string to check for matches with regular expression pattern.
2. pat
| regular expression
The regular expression pattern for matching.
3. pos
| integer
| optional
The position in expr
at which to start the search. Defaults to 1
.
4. occurrence
| number
| optional
Which occurrence of a match to return the index for. Defaults to 1
.
5. return_option
| 0 or 1
| optional
0
: returns the position of first character of matched substring. Default behavior.
1
: returns the position of the character following the matched substring.
6. match_type
| string
| optional
Specifies how to perform matching. Multiple characters may be specified, however, if there is a contradiction between the provided match_types
the match_type
on the right take precedence.
match_type | Meaning |
---|---|
| Case sensitive matching. |
| Case-insensitive matching. |
| Multiple-line mode. Recognize line terminators within the string. The default behavior is to match line terminators only at the start and end of the string expression. |
| The |
| Unix-only line endings. Only the newline character is recognized as a line ending by the |
Return value
The return value depends on the follow cases:
Case | Return value |
---|---|
No match found | 0 |
| Index position of the first character of the matched substring. |
| Index position of character following the matched substring. |
Examples
Consider the following table about some students:
student_id | fname | lname | day_enrolled | age | username |
---|---|---|---|---|---|
1 | Sky | Towner | 2015-12-03 | 17 | stowner1 |
2 | Ben | Davis | 2016-04-20 | 19 | bdavis2 |
3 | Travis | Apple | 2018-08-14 | 18 | tapple3 |
4 | Arthur | David | 2016-04-01 | 16 | adavid4 |
5 | Benjamin | Town | 2014-01-01 | 17 | btown5 |
The above sample table can be created using the code here.
Basic usage
To return index position of first occurrence of i
or e
in student first names:
SELECT fname, REGEXP_INSTR(fname,'[ie]')FROM students;
+----------+----------------------------+| fname | REGEXP_INSTR(fname,'[ie]') |+----------+----------------------------+| Sky | 0 || Ben | 2 || Travis | 5 || Arthur | 0 || Benjamin | 2 |+----------+----------------------------+
Position
To start regex matching from position 3
:
SELECT fname, REGEXP_INSTR(fname,'[ie]', 3, 1, 0, 'c')FROM students;
+----------+------------------------------------------+| fname | REGEXP_INSTR(fname,'[ie]', 3, 1, 0, 'c') |+----------+------------------------------------------+| Sky | 0 || Ben | 0 || Travis | 5 || Arthur | 0 || Benjamin | 7 |+----------+------------------------------------------+
Note that any occurrences of i
or e
before position 3
are ignored.
Occurence
To return the second occurrence of i
or e
in student first names:
SELECT fname, REGEXP_INSTR(fname, '[ie]', 1, 2, 0, 'c')FROM students;
+----------+-------------------------------------------+| fname | REGEXP_INSTR(fname, '[ie]', 1, 2, 0, 'c') |+----------+-------------------------------------------+| Sky | 0 || Ben | 0 || Travis | 0 || Arthur | 0 || Benjamin | 7 |+----------+-------------------------------------------+
Note that only Benjamin
has two occurrences of i
or e
in fname
.
Return option
Reminder of the students
table we are working with:
student_id | fname | lname | day_enrolled | age | username |
---|---|---|---|---|---|
1 | Sky | Towner | 2015-12-03 | 17 | stowner1 |
2 | Ben | Davis | 2016-04-20 | 19 | bdavis2 |
3 | Travis | Apple | 2018-08-14 | 18 | tapple3 |
4 | Arthur | David | 2016-04-01 | 16 | adavid4 |
5 | Benjamin | Town | 2014-01-01 | 17 | btown5 |
To set return option=1
to return the position of the character after the match:
SELECT fname, REGEXP_INSTR(fname,'[ie]', 1, 1, 1, 'c')FROM students;
+----------+------------------------------------------+| fname | REGEXP_INSTR(fname,'[ie]', 1, 1, 1, 'c') |+----------+------------------------------------------+| Sky | 0 || Ben | 3 || Travis | 6 || Arthur | 0 || Benjamin | 3 |+----------+------------------------------------------+
Note that we return the index position of the character after the first occurrence of i
or e
in first names.
Match type
To perform a case sensitive match by specifying match_type='c'
:
SELECT fname, REGEXP_INSTR(fname,'[a]', 1, 1, 0, 'c')FROM students;
+----------+-----------------------------------------+| fname | REGEXP_INSTR(fname,'[a]', 1, 1, 0, 'c') |+----------+-----------------------------------------+| Sky | 0 || Ben | 0 || Travis | 3 || Arthur | 0 || Benjamin | 5 |+----------+-----------------------------------------+
Note that we return 0
for Arthur
as we only look for matches with lowercase a
.