我用以下正则表达式继承了一些 C# 代码
Regex(@"^[a-zA-Z''-'\s]{1,40}$")
我理解这个字符串,除了单引号的作用。我已经搜索了所有内容,但似乎找不到解释。有任何想法吗?
我用以下正则表达式继承了一些 C# 代码
Regex(@"^[a-zA-Z''-'\s]{1,40}$")
我理解这个字符串,除了单引号的作用。我已经搜索了所有内容,但似乎找不到解释。有任何想法吗?
据我所知,这个表达是多余的。
它匹配a-z
or A-Z
,或者'
字符,或者介于'
and之间的任何东西'
(当然这只是'
字符,或者任何空格。
我已经使用RegexPal对此进行了测试,它似乎与这些字符不匹配。也许序列是由代码生成的,或者它用于匹配早期版本中更广泛的字符?
更新:根据您的评论(匹配名称),我会继续猜测作者认为他通过将连字符放在引号中来逃避连字符,并且不是最出色的软件测试人员。他们的意思可能是:
Regex(@"^[a-zA-Z'\-\s]{1,40}$") //Escaped the hyphen
也可以写成:
Regex(@"^[a-zA-Z'\s-]{1,40}$") //Put the hyphen at the end where it's not ambiguous
因为它是三个单引号字符是多余的。它们代表单引号字符 (#1) 和以单引号开始和结束的字符范围(#2 和 #3 用连字符分隔)。
看起来这是一个错误,作者似乎打算通过将连字符“转义”在单引号中来在类中包含连字符。在不转义的情况下,连字符代表一个字符范围,就像在 az 和 AZ 中一样。
我猜原作者的意思是 [a-zA-Z'\-\s]
多余的撇号是多余的,所以没有多大意义。一种可能性是作者试图避开破折号以将其包含在模式中,但正确的方法是使用反斜杠:
Regex(@"^[a-zA-Z'\-\s]{1,40}$")
(例如,在文字周围使用撇号用于自定义格式字符串,作者可能在其中使用了它。)
使用撇号/单引号三次才有意义的唯一方法是,如果第二个和第三个实例实际上是花哨的单引号,例如 '、' 和 ‛。如果是这样,更好(更清晰)的表示方式是使用 unicode 转义:
Regex(@"^[a-zA-Z'\u2018-\u201B\s]{1,40}$")
顺便说一句,某些语言(例如 PowerShell)明确允许使用这些单引号并将它们视为 ASCII ' (0x27) 字符。来自 PowerShell 2.0 语言规范:
单引号字符:
' (U+0027)
Left single quotation mark (U+2018)
Right single quotation mark (U+2019)
Single low-9 quotation mark (U+201A)
Single high-reversed-9 quotation mark (U+201B)