我正在尝试创建一个接受所有字符、国际重音符号的函数。但应排除任何逗号和感叹号并拒绝该字符串。
到目前为止,我已经创建了一个包含存储值的列的表。 我只需要向前移动那些没有逗号和感叹号的值。
我使用的正则表达式如下:
IF column_value not REGEXP concat('[',x'21','-',x'2C',x'2E','-',x'40',x'5B','-',x'60',x'7B','-',x'7E',x'A1','-',x'BF',']') then
SET is_valid = 1;
这不是拒绝包含我不需要的字符的行的正则表达式格式。其他所有内容都应存储在我创建的 utf8_unicode_ci 列中。
目前,直到十六进制代码 (DF) 为止的所有值都标记为有效。
但是,其余值被标记为无效。例如,è
被标记为无效。
你能帮忙吗?
最佳答案
UPDATE table_name SET is_valid = 1 WHERE column_value NOT REGEXP '[,!]+';
或
UPDATE table_name SET is_valid = 1 WHERE column_value REGEXP '[^,!]+';
关于您最后一个关于 è
的问题的简短说明:
我可以看到带有重音的小拉丁字母 E。在 unicode 中它看起来像 \u0065\u0300
,但在 UTF-8 中它是三个字节 \x65\xCC\x80
。
REGEX 分别检查每个字节。让我们看看您的过滤器:
[
\x21-\x2C //PASS
\x2E-\x40 //PASS
\x5B-\x60 //PASS
\x7B-\x7E //PASS
\xA1-\xBF //PASS
]
但是,如果这是一个带有严重 \u00e8
的拉丁小写字母 E,则 UTF-8 为 \xC3\xA8
:
[
\x21-\x2C //PASS
\x2E-\x40 //PASS
\x5B-\x60 //PASS
\x7B-\x7E //PASS
\xA1-\xBF // \xA8 IS FILTERED THERE
]
è
和 è
看起来一样,但搞得一团糟。这就是寻找简化 REGEX 并尽可能避免 Unicode 参与其中的方法的原因。
关于mysql 正则表达式接受所有国际重音符号,不接受逗号或感叹号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27591692/