2014-12-21 22 views
0

我想創建一個接受所有字符,國際口音標記的函數。但是應該排除任何逗號和感嘆號,並拒絕該字符串。mysql正則表達式接受所有國際口音標記,沒有逗號或感嘆號

到目前爲止,我創建了一個存儲值的列表。 我只需要移動那些沒有逗號和感嘆號的值。

我使用的是正則表達式如下:

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列中。

現在,所有直到HEX碼(DF)的值都被標記爲有效。 但是,其餘的值被標記爲無效。例如,è被標記爲無效。 你能幫忙嗎?

回答

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涉及的原因。

+0

請考慮增加關於你的答案的_why_更多細節。 –

+0

我相信這個「​​只會移動那些沒有逗號和驚歎號的值」,就像@Tammy上面提到的那樣。 –

+0

我的問題是,我驗證了不同國家的名字。我現在可以看到很多人都使用過數字,‡,™(公司名稱)。因爲,他們不是個人,我試圖過濾它們。這就是使用十六進制代碼的原因。 @Ruben,讓我嘗試在非正則表達式中插入這些字符,看看它是否能完成這項工作。 – Tammy

0

感謝您的指導。

我創建了一個包含特殊字符及其十六進制代碼的表格。我將每個字符串轉換爲十六進制('string of value')。現在,我使用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;