Printable驗證

  • 66
  • 0

Printable驗證

資料表中有某欄位供使用者自行輸入、Excel匯入,目前有需求使用該欄位資料來進行比對,卻有幾筆資料看上去值相同,比對結果卻不相符

查看後發現該值結尾有個Tab字元,且oracle sql加上trim也沒有去除,可能是因為以往並沒有使用該欄位作為比對依據,所以一直沒發現問題

先將oracle DB資料修正,目前先針對ascii 1至ascii 31清掉,但是還不確定是不是這樣就能清除所有non-printable字元,如果還有遺漏的還要再修改

 update targetTable
    set targetColumn = REGEXP_REPLACE(targetColumn , '[' || CHR(1) || '-' || CHR(31) || ']', '')
  where regexp_like(targetColumn , '[' || CHR(1) || '-' || CHR(31) || ']')

.net MVC加入ViewModel驗證屬性,只允許該欄位儲存printable字元,目前使用char.IsControl判斷

    /// <summary> 驗證字串為Printable </summary>
    public class PrintableStr : ValidationAttribute
    {
        protected override ValidationResult IsValid(object value, ValidationContext validationcontext)
        {
            if (value == null || string.IsNullOrEmpty(value.ToString()))
            {
                return ValidationResult.Success;
            }
            string strValue = value.ToString();

            if (strValue.Any(c => char.IsControl(c)))
            {
                return new ValidationResult("不可包含non-printable字元(如:Tab、換行符號等)");
            }
            return ValidationResult.Success;
        }
    }

正規表示似乎也能達到相同效果

new Regex(@"\p{C}+").IsMatch(inputStr)

接著再套ModelState驗證就可以了,順便檢查下還有哪些欄位需要用於比對卻可能包含non-printable字元

之後又測試了C#的Trim(),可以去除Tab,如果只要去除字首字尾的non-printable字元似乎也可以使用C# Trim()

 

參考

https://stackoverflow.com/questions/40564692/c-sharp-regex-to-remove-non-printable-characters-and-control-characters-in-a/40568888

https://stackoverflow.com/questions/11137947/print-non-printable-characters-in-a-given-string