mysql 正则表达式接受所有国际重音符号,不接受逗号或感叹号

标签 mysql regex

我正在尝试创建一个接受所有字符、国际重音符号的函数。但应排除任何逗号和感叹号并拒绝该字符串。

到目前为止,我已经创建了一个包含存储值的列的表。 我只需要向前移动那些没有逗号和感叹号的值。

我使用的正则表达式如下:

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/

相关文章:

mysql - 检查mysql的约束

php - 我将如何在一个查询中加入这两个查询?

r - 如何使用 stringr 和 regex 转换字符串(更改、保留、提取),但有一些异常(exception)?

python - 配置 .travis.yml 以支持 mysql-connector-python

php - 多个关键字搜索脚本需要一些专家输入

php - 如果数据库中存在数字,则给出另一个随机整数 (PHP)

regex - 如何为命名捕获组创建条件正则表达式?

ruby - 由反向引用定义的正则表达式重复

regex - Word通配符搜索的正则表达式查找包含至少3个连续数字的括号

c# - 排除字符串开头和结尾的特殊字符