Я думаю, что вы должны предоставить свое собственное определение того, что представляет собой символ слова, вместо того, чтобы полагаться на границы слов по умолчанию ICE ([[:<:]]
, [[:>:]]
). Из документации mysql 5.6 :
Слово - это последовательность символов слова, которой не предшествуют и не следуют символы слова. Символ слова - это буквенно-цифровой символ в классе alnum или знак подчеркивания (_
).
Это будет означать: '^|[^[:alnum:]_]'
^ -- the beginning of the string
| -- OR
[^ -- any character OTHER than
[:alnum:] -- an alphanumeric character
_ -- an underscore
]
И конец строки ICE будет: '[^[:alnum:]_]|$'
, где $
представляет конец строки.
Вы можете просто изменить это, чтобы добавить одинарную кавычку в класс символов, например:
- начало:
'^|[^[:alnum:]_'']'
- конец:
'[^[:alnum:]_'']|$'
Вот ваше регулярное выражение:
SELECT (val REGEXP CONCAT('(^|[^[:alnum:]_''])', 'cat''s', '([^[:alnum:]_'']|$)'));
См. Демо на dbfiddle
Схема (MySQL v5.6)
Запрос № 1
Select ('cat''s'
REGEXP CONCAT('(^|[^[:alnum:]_''])', 'cat''s', '([^[:alnum:]_'']|$)')) res;
| res |
| --- |
| 1 |
Запрос № 2
Select ('''cat''s'
REGEXP CONCAT('(^|[^[:alnum:]_''])', '''cat''s', '([^[:alnum:]_'']|$)' )) res;
| res |
| --- |
| 1 |
Запрос № 3
Select ('_cat''s'
REGEXP CONCAT('(^|[^[:alnum:]_''])', '_cat''s' , '([^[:alnum:]_'']|$)' )) res;
| res |
| --- |
| 1 |
Запрос № 4
Select ('-cat''s'
REGEXP CONCAT('(^|[^[:alnum:]_''])', '-cat''s' , '([^[:alnum:]_'']|$)' )) res;
| res |
| --- |
| 1 |
Запрос № 5
Select (' cat''s'
REGEXP CONCAT('(^|[^[:alnum:]_''])', ' cat''s' , '([^[:alnum:]_'']|$)' )) res;
| res |
| --- |
| 1 |
Запрос № 6
Select ('cat'''
REGEXP CONCAT('(^|[^[:alnum:]_''])', 'cat''' , '([^[:alnum:]_'']|$)' )) res;
| res |
| --- |
| 1 |