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

7

我正在使用Objective-C编写正则表达式。

转义序列\w是非法的并会发出警告,因此必须将正则表达式/\w/写成@"\\w";转义序列\?有效的,显然的,不会发出警告,因此正则表达式/\?/必须写成@"\\?"(即必须转义反斜杠)。

问号不像\t\n那样是不可见的,那么为什么\?是一个有效的转义序列?

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

NSString *valid = @"\?";

相比之下,这个会发出一个警告("Unknown escape sequence '\w'"):
NSString *invalid = @"\w";

这意味着你正在尝试匹配(根据函数而定)一个字面上的 ? - Jerry
可能是为什么在C/C++中"?"是转义序列?的重复问题(Objective-C从C继承了这个特性,所以实际上是一个重复的问题)。 - Cody Gray
2个回答

14

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

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


1
好的回答!谢谢你提供历史背景。 - smholloway
1
但是,在字符串字面值中它真的没用。你可以使用十六进制值"\x3f"来表示任何符号。 - Hrisip

-1

在正则表达式中,?是一个量词,表示出现0次或1次。当它附加到+*量词后面时,它使其“懒惰”匹配。

例如,在字符串foo?上应用正则表达式o?将匹配o

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

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

更多关于量词的信息这里


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接