我继承了一些C#代码,其中包含以下正则表达式:
Regex(@"^[a-zA-Z''-'\s]{1,40}$")
除了单引号的作用之外,我理解这个字符串。我搜索了整个网络,但似乎找不到解释。你有什么想法吗?
我继承了一些C#代码,其中包含以下正则表达式:
Regex(@"^[a-zA-Z''-'\s]{1,40}$")
除了单引号的作用之外,我理解这个字符串。我搜索了整个网络,但似乎找不到解释。你有什么想法吗?
a-z
或 A-Z
,或者 '
字符,或者在 '
和 '
之间的任何字符(当然只有 '
字符,或者任何空格)。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
\-
)或连字符不会与范围产生歧义(例如在开头或结尾)时,它才会匹配连字符。下面还有一些其他聪明的理论,解释了作者的意思。 - Mike ChristensenRegex(@"^[a-zA-Z'\u2018-\u201B\s]{1,40}$")
顺便提一下,有些语言(如PowerShell)明确允许使用这些花括号单引号,并将其视为ASCII '(0x27)字符的相同。来自PowerShell 2.0语言规范:
single-quote-character:
' (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)
Regex(@"^[a-zA-Z'\-\s]{1,40}$")
在自定义格式字符串中,使用撇号来表示文字是一个例子,作者可能会采用这种方式。
由于三个单引号字符是多余的,因此它们代表了单引号字符(#1)以及以单引号开头和结尾的字符范围(#2和#3由连字符分隔)。
看起来这是一个错误,作者似乎本意是在类中包含连字符字符,并通过单引号进行“转义”。如果不进行转义,则连字符表示字符范围,例如a-z和A-Z。
我猜原始作者的意思是[a-zA-Z'\-\s]