mysql正则表达式接受所有国际口音标记,没有逗号或感叹号

时间:2014-12-21 17:05:49

标签: 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;

这不是regexp格式,以拒绝包含我不需要的字符的行。其他所有内容都应存储在我创建的utf8_unicode_ci列中。

目前,所有直到HEX代码(DF)的值都标记为有效。 但是,其余值标记为无效。例如,è标记为无效。 你能帮忙吗?

2 个答案:

答案 0 :(得分:0)

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。

答案 1 :(得分:0)

感谢您的指导。

我创建了一个包含特殊字符及其十六进制代码的表。我将每个字符串转换为十六进制('字符串'的值)。现在,我使用instr(十六进制('字符串'的值),@ hex_value_from_table)。

@hex_value_from_table从表中选取每个特殊字符的值,并检查字符串中是否出现。这样,如果必须删除任何字符,我不会更改正则表达式,而是添加/删除"值"中的条目。特殊字符表。

查询:

create table special_char_hex_codes
(
char_name varchar(500) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT 'Character to be rejected',
hex_value varchar(500) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT 'Character hexadecimal value'
);

set sql_safe_updates = 0;
delete from eligibility_file_reject_chars ;

insert into special_char_hex_codes select '€',hex('€')      ;

select instr(hex('Wilâmer'),trim(hex_value)) as str_exists
from
(
select char_name,hex_value from special_char_hex_codes 
) as test;