2013-08-09 14 views
5

Sto scrivendo un'espressione regolare in Objective-C.Che cosa significa ? (sequenza di punti interrogativi con barra inversa) significa sequenza di escape?

La sequenza di escape \w è illegale ed emette un avviso, pertanto l'espressione regolare /\w/ deve essere scritta come @"\\w"; la sequenza di escape \? è valid, apparently, e non emette un avviso, pertanto l'espressione regolare /\?/ deve essere scritta come @"\\?" (ad esempio, la barra retroversa deve essere preceduta da escape).

I punti interrogativi non sono invisibili come \t o \n, quindi perché \? una sequenza di escape valida?

Modifica: Per chiarire, non sto chiedendo del quantificatore, sto chiedendo di una sequenza di escape delle stringhe. Cioè, questo non emette un avvertimento:

NSString *valid = @"\?"; 

Al contrario, questo vuol emettono un avvertimento ("sequenza di escape Unknown '\ w'"):

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

Significa che stai cercando di far corrispondere (a seconda della funzione) un valore letterale '?'? – Jerry

+0

Possibile duplicato di [Perché è "\?" una sequenza di escape in C/C++?] (http://stackoverflow.com/questions/19374878/why-is-an-escape-sequence-in-cc) (Objective-C eredita questa caratteristica da C, quindi questo è in realtà un duplicato.) –

risposta

7

Specifica un punto interrogativo letterale. È necessario a causa di una funzionalità poco conosciuta denominata trigraphs, in cui è possibile scrivere una sequenza di tre caratteri che inizia con punti interrogativi per sostituire un altro carattere. Se hai abilitato i trigraph, per scrivere "??" in una stringa, è necessario scriverlo come "?\?" per evitare che il preprocessore provi a leggerlo come l'inizio di un trigramma.

(Se vi state chiedendo: "Perché qualcuno dovrebbe introdurre una funzione come questa?":.. Alcune tastiere o set di caratteri non hanno incluso i simboli comunemente usati come { così hanno introdotto trigrammi così si potrebbe scrivere ??< invece)

+1

Buona risposta! Grazie anche per il contesto storico. – smholloway

-1

? in regex è un quantificatore, significa 0 o 1 occorrenza. Quando viene aggiunto ai quantificatori + o *, lo rende "pigro".

Ad esempio, applicare la regex o? alla stringa foo? corrisponderà a o.

Tuttavia, la regex o\? in foo? sarebbe partita o?, perché è alla ricerca di un punto di domanda letterale nella stringa, invece di un quantificatore arbitrario.

L'applicazione della regex o*? a foo? corrisponde a oo.

Ulteriori informazioni sui quantificatori here.

+2

Hai frainteso la mia domanda. Si prega di leggere la modifica. – thomasd