正则表达式检测非拉丁字符

时间:2018-07-05 14:47:11

标签: regex email security

为了锁定电子邮件安全系统,我发现了一条规则,该规则声称阻止具有任何连续的4个非拉丁字符的电子邮件,

[^[:ascii:]\p{Latin}\pCc\pCf\pM\pZ\pP\pS]{4}.

我玩过任何正则表达式都已经有几年了,但我想我记得很不错。

我的问题和困惑是,为什么使用Unicode通用类别代码? Ive找到了一个不错的列表here,但是在帮助理解它们各自的用途方面并不是很出色。

感谢您提供的任何帮助。

2 个答案:

答案 0 :(得分:0)

请在下面找到说明:

  

[^->匹配列表中不存在的单个字符

     

[:ascii:]->任何有效的ascii字符

     

\ p {Latin}->匹配拉丁脚本中的任何字符

     

\ pC->匹配不可见的控制字符和未使用的代码点

     

c->匹配文字字符c

     

\ pC->已经解释

     

f->匹配文字字符f

     

\ pM->匹配要与另一个字符组合的字符   字符

     

\ pZ->匹配任何类型的空格或不可见的分隔符

     

\ pP->匹配任何标点符号

     

\ pS->匹配任何数学符号,货币符号,装饰符号等。

     

{4}->恰好出现4个先前的范围

答案 1 :(得分:0)

我认为我能说得比来源更好:Unicode®Standard Annex#44 UNICODE CHARACTER DATABASE General Category Values

  

代码点的General_Category属性为该代码点提供了最一般的分类。通常根据该代码点分配的字符的主要特征来确定它。例如,字符是字母,标记,数字,标点符号还是符号?如果是,则是什么类型?

     

...

     

许多字符有多种用途,并且不是所有此类情况都可以通过General_Category值完全捕获。 …General_Category只是字符的一阶,最常见的分类。

关于出于安全考虑为何使用它们的情况,对于使用拉丁文字的读者来说,这似乎是一种避免Unicode Confusables的方法。

  

易混淆的字符是那些可能与其他字符混淆的字符(在某些常见的UI字体中),例如拉丁字母“ o”和希腊字母omicron“ο”。字体会有所不同:例如,希伯来语字符“ He”在某些字体(例如Arial希伯来语)中看起来与“ o”相似,令人困惑。

例如,可以构建超链接以将读者带到该读者不愿意去的网站。