2010-08-15 3 views
36

Ho bisogno di fare un sacco di cose regex in javascript ma sto avendo alcuni problemi con la sintassi e non riesco a trovare una risorsa definitiva su questo .. per alcuni ragione quando lo faccio:Regex per estrarre la sottostringa, restituendo 2 risultati per qualche motivo

var tesst = "afskfsd33j" 
var test = tesst.match(/a(.*)j/); 
alert (test) 

mostra

"afskfsd33j, fskfsd33" 

non sono sicuro che il motivo per cui il suo dare questa uscita di originale e la stringa corrispondente, mi chiedo come posso farlo per dare solo il match (essenzialmente estraendo la parte che voglio dalla stringa originale)

Grazie per qualsiasi consiglio

+3

Fate attenzione che non si ha l'originale e la stringa corrispondente, come dichiarate. Hai la stringa "afskfsd33j" abbinata. Poi la seconda voce "fskfsd33" proveniente dalla parentesi nella vostra regexp: (*). – Mic

risposta

73

match restituisce un array.

La rappresentazione di stringa predefinita di una matrice in JavaScript è gli elementi dell'array separati da virgole. In questo caso il risultato desiderato è nel secondo elemento dell'array:

var tesst = "afskfsd33j" 
var test = tesst.match(/a(.*)j/); 
alert (test[1]); 
+1

ohh ok, credo che ho perso che .. grazie, mi confondo con javascript volte da quando io sono abituato al modo più ristretto di stampa array in php – Rick

+1

Probabilmente suono stupido, ma perché la corrispondenza restituisce la stringa originale? C'è qualche documentazione su questo? –

+4

@ john-lee È perché la stringa originale corrisponde alla regex '/ a (. *) J /' e la seconda voce dell'array contiene il primo gruppo corrispondente '(. *)'. Inoltre il gruppo (0) è sempre l'intera partita mentre il gruppo (n) è il n-esimo gruppo contrassegnato da parentesi. Spero che questo sia comprensibile se non provi [questa documentazione per maggiori informazioni.] (Https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Global_Objects/String/match) –

4

Credo che il problema è che il metodo match restituisce un array. Il 0 ° elemento dell'array è la stringa originale, gli articoli dal 1 ° all'8 ° corrispondono agli articoli con parentesi coordinati dal 1 ° al n. La tua chiamata "alert()" sta mostrando l'intero array.

+4

Non so se questo è errato o mal scritto. Il primo elemento nell'array ('test [0]') non è l'intera stringa, è la parte della stringa che è stata abbinata all'intera espressione regolare. In questo caso capita di essere lo stesso, ma se la regex fosse stata '/ f (. *) J /', il risultato sarebbe stato 'fskfsd33j, skfsd33' (l'iniziale' a' non è incluso nella corrispondenza) . –

3

Ho appena avuto lo stesso problema.

Si ottiene il testo solo due volte nel risultato se si include un gruppo di corrispondenza (tra parentesi) e il modificatore "g" (globale). Il primo elemento è sempre il primo risultato, normalmente OK quando si utilizza partita (reg) su una breve stringa, tuttavia quando si utilizza un costrutto simile:

while ((result = reg.exec(string)) !== null){ 
    console.log(result); 
} 

i risultati sono un po 'diverso.

provare il seguente codice:

var regEx = new RegExp('([0-9]+ (cat|fish))','g'), sampleString="1 cat and 2 fish"; 
var result = sample_string.match(regEx); 
console.log(JSON.stringify(result)); 
// ["1 cat","2 fish"] 

var reg = new RegExp('[0-9]+ (cat|fish)','g'), sampleString="1 cat and 2 fish"; 
while ((result = reg.exec(sampleString)) !== null) { 
    console.dir(JSON.stringify(result)) 
}; 
// '["1 cat","cat"]' 
// '["2 fish","fish"]' 

var reg = new RegExp('([0-9]+ (cat|fish))','g'), sampleString="1 cat and 2 fish"; 
while ((result = reg.exec(sampleString)) !== null){ 
    console.dir(JSON.stringify(result)) 
}; 
// '["1 cat","1 cat","cat"]' 
// '["2 fish","2 fish","fish"]' 

(testato su recente V8 - Chrome, Node.js)

La risposta migliore è attualmente un commento che non posso upvote, così credito a @ Mic.

2

Ogni gruppo definito da parentesi() viene catturato durante l'elaborazione e ogni contenuto di gruppo catturato viene inserito nell'array dei risultati nello stesso ordine in cui iniziano i gruppi all'interno del modello. Vedere anche sulla http://www.regular-expressions.info/brackets.html e http://www.regular-expressions.info/refcapture.html (scegliere la lingua giusta per vedere le funzionalità supportate)

var source = "afskfsd33j" 
var result = source.match(/a(.*)j/); 

result: ["afskfsd33j", "fskfsd33"] 

Il motivo per cui hai ricevuto questo risultato esatto è il seguente:

Primo valore in ordine è la prima stringa trovata che conferma l'intero modello. Quindi dovrebbe assolutamente iniziare con "a" seguito da un numero qualsiasi di caratteri e termina con il primo carattere "j" dopo l'avvio di "a".

Il secondo valore nell'array è il gruppo catturato definito da parentesi. Nel tuo caso il gruppo contiene l'intera corrispondenza del modello senza il contenuto definito al di fuori della parentesi, quindi esattamente "fskfsd33".

Se si vuole sbarazzarsi di secondo valore in serie è possibile definire modello come questo:

/a(?:.*)j/ 

dove ":?" Significa che un gruppo di caratteri che corrisponde al contenuto tra parentesi non farà parte della matrice risultante.

Altre opzioni potrebbero essere in questo caso semplice di scrivere modello senza alcun gruppo perché non è necessario l'utilizzo di gruppo a tutti:

/a.*j/ 

Se si desidera verificare solo se il testo di origine corrisponde al modello e lo fa non importa quale testo ha trovato di quanto tu possa provare:

var result = /a.*j/.test(source); 

Il risultato dovrebbe restituire quindi solo valori true | false. Per maggiori informazioni visita http://www.javascriptkit.com/javatutors/re3.shtml