我正在尝试创建一个接受所有字符,国际重音标记的函数。但是应该排除任何逗号和感叹号,并拒绝字符串。
到目前为止,我已经创建了一个包含存储值的列的表。 我只需要向前移动那些没有逗号和感叹号的值。
我使用的正则表达式如下:
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)的值都标记为有效。
但是,其余值标记为无效。例如,è
标记为无效。
你能帮忙吗?
答案 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;