我目前正在使用这个网站为我想要构建的编程语言创建一些正则表达式,目前我只是为标识符设置表达式。
在我的语言中,标识符表达方式与大多数语言一样:
鉴于这些规则,我自己想出了以下表达式:
^\D\w+$
显然,它没有考虑特殊字符,但是下面的表达式(我没有自己制作):
^(?!\d)\w+$
为什么第二个表达式会占用特殊字符?它们不应该产生相同的结果吗?
答案 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+$
相同