正则表达式和特殊字符

时间:2015-11-06 16:03:04

标签: regex

我有一个正则表达式,我需要过滤包含单词

的邮件

免费提供,grátis,grétis,grâtis,grôtis......

所以我认为这应该很简单,就像/gr.tis/一样,但它不起作用。我在Centos上使用这个正则表达式使用postfix来过滤电子邮件。

问题是如果邮件包含“免费”,它会被过滤,但如果它包含“grátis”或“grétis”......则不会。发生了什么事?

EDIT 由于某种原因。{1,5}工作。为什么呢?

3 个答案:

答案 0 :(得分:0)

尝试这样/gr.*tis/。它似乎是由特殊字符引起的编码问题,即“á”,“ô”,......

答案 1 :(得分:0)

我会选择一些更健壮的东西......

(?<=\b)(g|G)r(.)tis(?=\b)
  • 这将在字符串的开头或中间找到单词,
  • 搜寻大写字母G或小写字母g
  • 在空格,行尾或非单词字符之前停止,例如“,”或“。”

如果您使用

gr.[^ -~]{0,4}tis

然后你将匹配像lksdfkjhasgratisaljsdhfkjsdf这样的单词中的“免费”,因为免费提供在它的中间,正则表达式不足以知道免费只是单词的一部分而不是单词本身。所以你最终会得到误报和数字膨胀。

不仅如此,你永远不会匹配 -

GratisGrátisGrétisGrâtis或Grôtis

编辑我的答案以改善所采取的步骤

答案 2 :(得分:0)

正如我的评论所说:

.替换.{1,5}的原因在于,正在读取字符串的引擎是将非ASCII字母/符号读取为非实际字符(即,它可能是unicode字符)象\u00FF或其他)的符号表示

这就是guilhermerama的答案:/gr.*tis/并将.令牌替换为多个实例的原因。