什么是\? (反斜杠问号)转义序列是什么意思?

时间:2013-08-09 20:24:06

标签: objective-c nsstring escaping

我正在Objective-C中写一个正则表达式。

转义序列\w是非法的并发出警告,因此正则表达式/\w/必须写为@"\\w";转义序列\?valid, apparently,并且不发出警告,因此正则表达式/\?/必须写为@"\\?"(即必须转义反斜杠)。

问号不会像\t\n那样隐身,为什么\?是有效的转义序列?

编辑:为了澄清,我不是在询问量词,我是在询问字符串转义序列。也就是说,这不会发出警告:

NSString *valid = @"\?";

相比之下,这个发出警告(“未知转义序列'\ w'”):

NSString *invalid = @"\w";

2 个答案:

答案 0 :(得分:8)

它指定一个文字问号。因为一个名为trigraphs的鲜为人知的特性,你需要编写一个以问号开头的三字符序列来代替另一个字符。如果你启用了三字符,为了写“??”在字符串中,您需要将其写为"?\?",以防止预处理器尝试将其作为三字母的开头读取。

(如果你想知道“为什么有人会引入这样的功能?”:有些键盘或字符集不包括常用的符号,如{。所以他们引入了三字母,这样你就可以写{{ 1}}代替。)

答案 1 :(得分:-1)

正则表达式中的

?是一个量词,它表示0或1次出现。当附加到+*量词时,它会使它成为"懒惰"。

例如,将正则表达式o?应用于字符串foo?将与o匹配。

但是,o\?中的正则表达式foo?将匹配o?,因为它正在搜索字符串中的文字问号,而不是任意量词。

将正则表达式o*?应用于foo?将与oo匹配。

有关量词here的更多信息。