这个正则表达式中单引号的目的是什么?

时间:2012-08-07 21:21:31

标签: c# .net regex string-literals

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

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

我理解这个字符串除了单引号的作用。我搜遍了所有但似乎无法找到解释。有什么想法吗?

4 个答案:

答案 0 :(得分:4)

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

它匹配a-zA-Z,或'字符,或''之间的任何内容(当然只有{{1}再次,或任何空格。

我使用RegexPal对此进行了测试,但它似乎与这些字符不匹配。序列可能是由代码生成的,还是用于匹配早期版本中更广泛的字符?

更新:根据您的评论(与名称相匹配),我会继续猜测作者认为他是逃避连字符在引号中,并不是最出色的软件测试人员。他们可能的意思是:

'

也可以写成:

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

答案 1 :(得分: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)

答案 2 :(得分:1)

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

看起来这是一个错误,作者似乎打算通过用单引号“转义”它来在类中包含连字符。在没有转义的情况下,连字符表示字符范围,如a-z和A-Z。

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

答案 3 :(得分:1)

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

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

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