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

The*_*ter 24 php regex pcre escaping

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

[\w-.]
Run Code Online (Sandbox Code Playgroud)

匹配任何单词字符,以及减号和点.虽然它似乎在preg_match中工作,但我试图将它放入一个名为Reggy的实用程序中并且它抱怨"char类中的空范围".试验和错误告诉我这个问题是通过逃避减号来解决的,将正则表达式转化为

[\w\-.]
Run Code Online (Sandbox Code Playgroud)

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

Bar*_*ers 60

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

字符类中的元字符是:

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

所以这些都应该被逃脱.但是有一些角落案例:

  • -如果放在班级([abc-][-abc])的最开始或结束时不需要转义.在相当多的正则表达式实现中,当直接放在range([a-c-abc])或short-hand字符类([\w-abc])之后,它也不需要转义.这就是你观察到的
  • ^当它不在类的开头时不需要转义:[^a]表示除了之外的任何字符a,或[a^]匹配a或者^,等于:[\^a]
  • ]如果它是类中唯一的字符,则不需要转义:[]]匹配char]

  • @Pelle,谢谢.是的,您可以(或者应该)简单地使用`\]`而不是字符类,但我想提一下,许多正则表达式实现允许`[]]`匹配文字`]`.你甚至不需要转义`]`,因为它只是一个字符类中的元字符.在它之外,只有`[`需要从两个方括号中逃脱(但逃避`]`不会伤害!). (2认同)

bw_*_*ezi 6

[\w.-]
Run Code Online (Sandbox Code Playgroud)
  • .通常意味着任何字符,但之间[]没有特殊的意义
  • -between []表示范围,除非它被转义或者之间的第一个或最后一个字符[]