2013-08-09 14 views
5

Piszę wyrażenie regularne w Objective-C.Co robi ? (znak zapytania z ukośnikiem odwrotnym) oznacza sekwencję ucieczki?

Sekwencja specjalna \w jest niedozwolona i generuje ostrzeżenie, dlatego wyrażenie regularne /\w/ musi być napisane jako @"\\w"; sekwencja wyjściowa \? jest valid, apparently, i nie wysyła ostrzeżenia, więc wyrażenie regularne /\?/ musi być zapisane jako @"\\?" (tj. odwrotny ukośnik musi być uniknięty).

Znaki zapytania nie są niewidoczne jak \t lub \n, więc dlaczego \? jest prawidłową sekwencją specjalną?

Edit: W celu wyjaśnienia, nie pytam o kwantyfikatorem, pytam o sekwencji ciąg ewakuacji. Oznacza to, że ten nie emituje ostrzeżenie:

NSString *valid = @"\?"; 

Natomiast ten nie emitować ostrzeżenie ("nieznanej sekwencji ucieczki '\ w'"):

NSString *invalid = @"\w"; 
+0

Oznacza to, że próbujesz dopasować (w zależności od funkcji) dosłowne "?"? – Jerry

+0

Możliwy duplikat [Dlaczego "\?" sekwencja ucieczki w C/C++?] (http://stackoverflow.com/questions/19374878/why-is-an-escape-sequence-in-cc) (Objective-C dziedziczy tę funkcję od C, więc to jest faktycznie duplikat.) –

Odpowiedz

7

Określa literalny znak zapytania. Jest to potrzebne ze względu na mało znaną funkcję o nazwie trigraphs, w której można napisać trójznakową sekwencję zaczynającą się od znaków zapytania, aby zastąpić inną. Jeśli masz włączone trigrafy, w celu napisania "??" w ciągu znaków, należy zapisać go jako "?\?", aby uniemożliwić preprocesorowi odczytywanie go jako początku trigrafii.

(Jeśli zastanawiasz się „Dlaczego ktoś miałby wprowadzić funkcję takiego?”.. Niektóre klawiatury lub zestawy znaków nie zawierają powszechnie używane symbole jak { więc one wprowadzone trójznaków więc można napisać ??< zamiast)

+1

Dobra odpowiedź! Dzięki za kontekst historyczny. – smholloway

-1

? w regex jest kwantyfikatorem, oznacza 0 lub 1 wystąpienie. Po dołączeniu do kwantyfikatorów + lub * powoduje, że jest on "leniwy".

Na przykład zastosowanie wyrażenia o? do ciągu foo? będzie zgodne z o.

Jednak regex o\? w foo? pasowałby o?, ponieważ szuka dosłownym znakiem zapytania w ciągu, zamiast arbitralnej kwantyfikatorem.

Stosowanie wyrażeń regularnych o*? do foo? zostanie dopasowane do oo.

Więcej informacji o kwantyfikatorach here.

+2

Źle zrozumiałeś moje pytanie. Proszę przeczytać edycję. – thomasd

Powiązane problemy