我们运行了一个词典,并且遇到了搜索字符串开头带有撇号的搜索问题。在英语单词中,例如'twas 很少见,但在我们要处理的语言中,'被认为是单词字符,并且在词组开头非常常见(例如的< / em>)以及单词的结尾(例如 a')。
奇怪的是,如果RegEx搜索位于中间(例如 air a'bhòrd获得所有期望的结果),但看起来似乎并没有为此感到烦恼,而是在搜索开始或结束时使用' RegEx不会将字符串视为单词的一部分。
我们已经确定这是RegEx规范的一部分(只有字母数字字符和_被视为单词的一部分),但我们想知道是否有可能编写一个RegEx表达式来将撇号也视为一个字?
这是我们目前得到的:
-- Demonstration on MySQL 5.6.21 Community
Select ('cat''s' REGEXP CONCAT('[[:<:]]', 'cat''s', '[[:>:]]'));
-- returns 1
Select ('''cat''s' REGEXP CONCAT('[[:<:]]' ,'''cat''s' ,'[[:>:]]' ));
-- returns 0
Select ('_cat''s' REGEXP CONCAT('[[:<:]]' ,'_cat''s' ,'[[:>:]]' ));
-- returns 1
Select ('-cat''s' REGEXP CONCAT('[[:<:]]' ,'-cat''s' ,'[[:>:]]' ));
-- returns 0
Select (' cat''s' REGEXP CONCAT('[[:<:]]' ,' cat''s' ,'[[:>:]]' ));
-- returns 0
Select ('cat''' REGEXP CONCAT('[[:<:]]' ,'cat''' ,'[[:>:]]' ));
-- returns 0
任何欢迎您的建议:)
答案 0 :(得分:1)
我认为您应该提供自己的字字符定义,而不要依赖默认的ICE字边界([[:<:]]
,[[:>:]]
)。来自the mysql 5.6 documentation:
一个单词是一个单词字符序列,其前后没有单词字符。单词字符是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:]_'']|$)'));
模式(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 |