此正则表达式中单引号的目的是什么

本文关键字:是什么 单引号 正则表达式 | 更新日期: 2024-10-29 17:59:25

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

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

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

此正则表达式中单引号的目的是什么

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

它匹配a-zA-Z,或'字符,或''之间的任何字符(当然,这只是'字符或任何空格。

我已经使用 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
撇号/单引号

三次的唯一方法是,如果第二个和第三个实例实际上是花哨的卷曲单引号,例如'、'和'。如果是这样,更好(更清晰)的表示方法是使用 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)

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

看起来这是一个错误,作者似乎打算通过在单引号中"转义"来在类中包含连字符。 连字符无需转义,表示字符范围,如 a-z 和 A-Z。

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

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

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

(例如,在文本周围使用撇号用于自定义格式字符串,作者可能已经选择了它。