【问题标题】:Apostrophe at beginning/end of search string not treated as part of a word by RegEx搜索字符串开头/结尾处的撇号不被 RegEx 视为单词的一部分
【发布时间】:2019-01-19 00:12:38
【问题描述】:

我们运行字典时遇到了搜索字符串开头包含撇号的问题。在英语中,像 'twas 这样的单词非常少见,但在我们正在处理的语言中,' 被认为是一个单词字符,并且在短语的开头非常常见(例如 's) 以及单词的末尾(例如 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

非常欢迎任何建议:)

【问题讨论】:

  • 您是否正在测试整个列是否为“单词”?还是您在较长的字符串中检查“单词”?
  • 引用的'cats' 是“单词”吗?在您的测试用例中,它将是'''cats'''"cats" 同上。
  • 如果 GMB 的回答结果不充分,请提供更长的应该通过的“单词”列表和不通过的“单词”列表。

标签: mysql regex apostrophe


【解决方案1】:

我认为您应该提供自己的单词字符定义,而不是依赖默认的 ICE 单词边界([[:&lt;:]][[:&gt;:]])。来自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:]_'']|$)'));

See the demo on dbfiddle

架构 (MySQL v5.6)


查询 #1

Select ('cat''s'
    REGEXP CONCAT('(^|[^[:alnum:]_''])', 'cat''s', '([^[:alnum:]_'']|$)')) res;
|资源 | | --- | | 1 |

查询 #2

Select ('''cat''s' 
    REGEXP CONCAT('(^|[^[:alnum:]_''])', '''cat''s', '([^[:alnum:]_'']|$)' )) res;
|资源 | | --- | | 1 |

查询 #3

Select ('_cat''s'
    REGEXP CONCAT('(^|[^[:alnum:]_''])', '_cat''s' , '([^[:alnum:]_'']|$)' )) res;
|资源 | | --- | | 1 |

查询 #4

Select ('-cat''s'  
    REGEXP CONCAT('(^|[^[:alnum:]_''])', '-cat''s' , '([^[:alnum:]_'']|$)' )) res;
|资源 | | --- | | 1 |

查询 #5

Select (' cat''s' 
    REGEXP CONCAT('(^|[^[:alnum:]_''])', ' cat''s' , '([^[:alnum:]_'']|$)' )) res;
|资源 | | --- | | 1 |

查询 #6

Select ('cat'''
    REGEXP CONCAT('(^|[^[:alnum:]_''])', 'cat''' , '([^[:alnum:]_'']|$)' )) res;
|资源 | | --- | | 1 |

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-22
    相关资源
    最近更新 更多