正则表达式 - 为什么这两个表达式不会产生相同的结果?

时间:2018-05-05 08:10:39

标签: regex

我目前正在使用这个网站为我想要构建的编程语言创建一些正则表达式,目前我只是为标识符设置表达式。

在我的语言中,标识符表达方式与大多数语言一样:

  • 他们不能以数字或下划线以外的特殊字符开头
  • 在第一个字符后,它们可以包含字母数字和下划线字符

鉴于这些规则,我自己想出了以下表达式:

^\D\w+$

显然,它没有考虑特殊字符,但是下面的表达式(我没有自己制作):

^(?!\d)\w+$

为什么第二个表达式会占用特殊字符?它们不应该产生相同的结果吗?

3 个答案:

答案 0 :(得分:1)

我将解释为什么第二个正则表达式有效。

第二个正则表达式使用前瞻。匹配字符串的开头后,引擎会检查下一个字符是否为数字,但它与不匹配!这很重要,因为如果下一个字符不是数字,它会尝试使用\w来匹配相同的字符,如果字符是符号,则无法使用,如果它是一个数字,负向前瞻失败,没有任何匹配。

\D另一方面,如果字符不是数字,将匹配字符,而\w将匹配之后的字符。这意味着所有符号都被接受。

答案 1 :(得分:0)

^(?!\d)\w+$表示由单词字符[a-zA-Z0-9_]组成的字符串,不以数字开头。

^\D\w+$表示非数字字符,后跟[a-zA-Z0-9_]集中至少一个字符。

所以@ab01与第二个正则表达式匹配,而第一个正则表达式拒绝它。

答案 2 :(得分:0)

(?!\d)\w+表示"匹配一个没有前缀数字"的单词。但是,当您使用^$个字符进行包装时,它与^\w+$基本相同,这显然与^\D\w+$不同。 ^(?!\d).+\w+$(注意"。+"中间)的行为与^\D\w+$相同