RegEx不会将搜索字符串开头/结尾的撇号视为单词的一部分

时间:2019-01-19 00:12:38

标签: mysql regex apostrophe

我们运行了一个词典,并且遇到了搜索字符串开头带有撇号的搜索问题。在英语单词中,例如'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

任何欢迎您的建议:)

1 个答案:

答案 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:]_'']'
  • end:'[^[:alnum:]_'']|$'

这是您的正则表达式:

SELECT (val REGEXP CONCAT('(^|[^[:alnum:]_''])', 'cat''s', '([^[:alnum:]_'']|$)'));

See the demo on 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   |