在正则表达式中应该转义哪些文字字符?

2022-08-30 16:21:19

我刚刚编写了一个正则表达式,用于包含以下部分的php函数:preg_match

[\w-.]

匹配任何单词字符,以及减号和点。虽然它似乎在preg_match工作,但我试图把它放到一个名为Reggy的实用程序中,它抱怨“char类中的空范围”。反复试验告诉我,这个问题是通过转义减号来解决的,将正则表达式变成

[\w\-.]

由于原文似乎在PHP中工作,我想知道为什么我应该或不应该转义减号,并且 - 因为点在PHP中也是一个有意义的字符 - 为什么我不需要转义点。我正在使用的实用程序只是愚蠢,它是否与另一种正则表达式方言一起使用,或者我的正则表达式真的不正确,我只是幸运地preg_match让我逃脱了它吗?


答案 1

在许多正则表达式实现中,以下规则适用:

字符类中的元字符包括:

  • ^(否定)
  • -(范围)
  • ](课程结束)
  • \(转义字符)

所以这些都应该被逃脱。不过,有一些极端情况:

  • -如果放置在类的开头或结尾(或 ),则无需转义。在相当多的正则表达式实现中,当直接放在范围 () 或速记字符类 () 之后时,它也不需要转义。这是你观察到的[abc-][-abc][a-c-abc][\w-abc]
  • ^当它不在类的开头时,不需要转义:表示除 以外的任何字符,并匹配或 ,它等于:[^a]a[a^]a^[\^a]
  • ]如果它是类中唯一的字符,则无需转义:匹配 char[]]]

答案 2
[\w.-]
  • 通常意味着任何字符,但之间没有特殊含义.[]
  • -between 表示一个范围,除非它是转义的,或者介于[][]

推荐