7

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

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

问号不是不可见的\tor \n,那么为什么是\?有效的转义序列?

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

NSString *valid = @"\?";

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

NSString *invalid = @"\w";
4

2 回答 2

13

它指定了一个文字问号。之所以需要它是因为一个鲜为人知的功能trigraphs,您可以在其中编写一个以问号开头的三字符序列来替换另一个字符。如果你启用了三元组,为了写“??” 在字符串中,您需要将其写入为"?\?"以防止预处理器尝试将其读取为三元组的开头。

(如果您想知道“为什么有人会引入这样的功能?”:一些键盘或字符集不包含常用的符号,例如{. 所以他们引入了三元组,以便您可以改写??<。)

于 2013-08-09T21:57:11.567 回答
-2

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

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

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

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

更多关于量词的信息在这里

于 2013-08-09T20:31:17.117 回答