4

我用以下正则表达式继承了一些 C# 代码

Regex(@"^[a-zA-Z''-'\s]{1,40}$")

我理解这个字符串,除了单引号的作用。我已经搜索了所有内容,但似乎找不到解释。有任何想法吗?

4

4 回答 4

5

据我所知,这个表达是多余的。

它匹配a-zor 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
于 2012-08-07T21:34:25.797 回答
1

因为它是三个单引号字符是多余的。它们代表单引号字符 (#1) 和以单引号开始和结束的字符范围(#2 和 #3 用连字符分隔)。

看起来这是一个错误,作者似乎打算通过将连字符“转义”在单引号中来在类中包含连字符。在不转义的情况下,连字符代表一个字符范围,就像在 az 和 AZ 中一样。

我猜原作者的意思是 [a-zA-Z'\-\s]

于 2012-08-07T21:52:55.327 回答
1

多余的撇号是多余的,所以没有多大意义。一种可能性是作者试图避开破折号以将其包含在模式中,但正确的方法是使用反斜杠:

Regex(@"^[a-zA-Z'\-\s]{1,40}$")

(例如,在文字周围使用撇号用于自定义格式字符串,作者可能在其中使用了它。)

于 2012-08-07T21:53:24.677 回答
1

使用撇号/单引号三次才有意义的唯一方法是,如果第二个和第三个实例实际上是花哨的单引号,例如 '、' 和 ‛。如果是这样,更好(更清晰)的表示方式是使用 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)
于 2012-08-07T21:45:42.253 回答