我正在Objective-C中写一个正则表达式。
转义序列\w
是非法的并发出警告,因此正则表达式/\w/
必须写为@"\\w"
;转义序列\?
是valid, apparently,并且不发出警告,因此正则表达式/\?/
必须写为@"\\?"
(即必须转义反斜杠)。
问号不会像\t
或\n
那样隐身,为什么\?
是有效的转义序列?
编辑:为了澄清,我不是在询问量词,我是在询问字符串转义序列。也就是说,这不会发出警告:
NSString *valid = @"\?";
相比之下,这个发出警告(“未知转义序列'\ w'”):
NSString *invalid = @"\w";
答案 0 :(得分:8)
它指定一个文字问号。因为一个名为trigraphs的鲜为人知的特性,你需要编写一个以问号开头的三字符序列来代替另一个字符。如果你启用了三字符,为了写“??”在字符串中,您需要将其写为"?\?"
,以防止预处理器尝试将其作为三字母的开头读取。
(如果你想知道“为什么有人会引入这样的功能?”:有些键盘或字符集不包括常用的符号,如{
。所以他们引入了三字母,这样你就可以写{{ 1}}代替。)
答案 1 :(得分:-1)
?
是一个量词,它表示0或1次出现。当附加到+
或*
量词时,它会使它成为"懒惰"。
例如,将正则表达式o?
应用于字符串foo?
将与o
匹配。
但是,o\?
中的正则表达式foo?
将匹配o?
,因为它正在搜索字符串中的文字问号,而不是任意量词。
将正则表达式o*?
应用于foo?
将与oo
匹配。
有关量词here的更多信息。