Perché il flag "globale" RegEx in JavaScript considera una proprietà di espressione regolare stessa?

0

In JavaScript, gli oggetti RegEx possono essere istanziati con flag come g per la corrispondenza globale e i per senza distinzione tra maiuscole e minuscole.

Intuitivamente, ha senso che i sia una proprietà del RegEx costruito, perché il motore RegEx sta facendo uno scanner dove 'A' e 'a' contano come lo stesso token.

Non riesco a trovare un argomento simile per il g flag, comunque. Ad esempio, il seguente codice sostituisce i caratteri "p" con i caratteri "d" (stampando "addle"):

"apple".replace(/p/g, "d");

Poiché RegEx corrisponde solo a una singola "p", deve corrispondere più volte per sostituire tutte le "p". Probabilmente, il RegEx non dovrebbe "sapere" che sarà usato in questo modo e il codice sarebbe più semantico se fosse permesso di essere scritto come questo, invece:

"apple".replace(/p/, "d", true);

Qual è il vantaggio del modo in cui JavaScript fa le cose? È lo stile / leggibilità, o forse c'è qualche ottimizzazione che questo consente?

    
posta acbabis 19.05.2016 - 23:46
fonte

1 risposta

2

Probabilmente perché è così che i flag di espressioni regolari vengono gestiti nella maggior parte degli editor di testo e di altri linguaggi di programmazione.

Un sacco di cose sulle espressioni regolari ha più senso quando le si utilizza in un editor di testo come vim, dove quasi tutte le azioni sono guidate da tastiera. Ad esempio, in vim se digito :s/foo/bar/g e premi invio, tutte le istanze di foo verranno sostituite con bar . Questo è dove l'estrema tenacia delle espressioni regolari è una grande vittoria. La maggior parte delle volte digiti la regex solo una volta per fare qualcosa, e non devi preoccuparti se un collega avrà problemi a trovare un senso domani. In questo contesto, l'implementazione di flag come singoli caratteri che pendono dalla fine del pattern ha perfettamente senso. Argomenti simili si applicano ai linguaggi di scripting quando vengono utilizzati per codice oneaaway piuttosto che per codebase aziendali di livello industriale.

Javascript ha semplicemente adottato la stessa sintassi delle espressioni regolari utilizzata da tutti gli altri, in modo che tutti quelli che avevano già familiarità con alcune delle espressioni regolari esistenti potessero usare Javascript senza troppo sforzo. Se dovessimo ridisegnare le normali expessions da zero come una caratteristica del linguaggio di programmazione piuttosto che una funzione di editor di testo, probabilmente gestiremmo i flag in modo molto diverso. Personalmente, andrei con un oggetto opzioni piuttosto che un "nudo booleano".

    
risposta data 20.05.2016 - 00:42
fonte

Leggi altre domande sui tag