2013-01-08 5 views
6

Qui è il caso:Split da un personaggio in JavaScript, ma non quelli contigui

var stringExample = "hello=goodbye==hello"; 
var parts = stringExample.split("="); 

uscita:

hello,goodbye,,hello 

Ho bisogno di questa uscita:

hello,goodbye==hello 

schiera/caratteri ripetuti deve essere ignorato, basta prendere il singolo "=" da dividere.

Forse un po 'di regex?

+1

Ci saranno sempre caratteri alfanumerici attorno a '=' s su cui vuoi dividere? Oppure potrebbe esserci qualcosa come "ciao: =! Ciao" che dovrebbe essere diviso in "ciao" e "ciao"? –

risposta

6

è possibile utilizzare un'espressione regolare:

var parts = stringExample.split(/\b=\b/); 

\b verifica la presenza di confini di parola.

+0

Penso che solo i segni di uguaglianza debbano essere ignorati, non tutti i caratteri non di parole. – Bergi

+0

@Bergi Non sono sicuro di vedere il tuo problema. Puoi venire con un esempio? –

+0

Grazie, ottima soluzione! –

3

Molto probabilmente, la risposta di @dystroys è quella che stai cercando. Ma se qualche carattere diverso da alfanumerici (A-Z, a-z, 0-9 o _) potrebbe circondare un "splitting ="), la sua soluzione non funzionerà. Ad esempio, la stringa

It's=risqué=to=use =Unicode!=See? 

sarebbe diviso in

"It's", "risqué=to", "use Unicode!=See?" 

Quindi, se è necessario evitare che, si usa normalmente un'affermazione lookbehind:

result = subject.split(/(?<!=)=(?!=)/); // but that doesn't work in JavaScript! 

Quindi, anche se questo sarebbe diviso solo su singolo = s, non è possibile utilizzarlo perché JavaScript non supporta il (?<!...) lookbehind asserzione.

Fortunatamente, si può sempre trasformare un'operazione split() in un match() un'operazione globale abbinando tutto ciò che è permesso tra delimitatori:

result = subject.match(/(?:={2,}|[^=])*/g); 

vi darà

"It's", "risqué", "to", "use ", "Unicode!", "See?" 
+0

+1 Mi chiedevo perché il lookbehind nello split non era funzionante. Il "non funziona in Javascript!" documentato da qualche parte? –

+0

@dystroy: http://www.regular-expressions.info/refflavors.html è la mia risorsa go-to per questo (o RegexBuddy). –

+2

'match' di solito non equivale a un' split' nel modo in cui gestisce le stringhe che iniziano/finiscono con delimitatori. Inoltre, potrebbe restituire 'null'. La trasformazione non è banale :-) E almeno avresti bisogno di usare '*' invece di '+' – Bergi

-1

Come prima approssimazione ad un possibile soluzione:

".*[^=]=[^=].*" 

Nota che questa è solo la regex, se vuoi usarla con egrep, sed, java regex o qualsiasi altra cosa, fai attenzione se qualcosa deve essere sfuggito.

ATTENZIONE !: Questa è una prima approssimazione, potrebbe essere migliorata. Nota che, ad esempio, questa regex non corrisponderà a questa stringa "=" (null - equal - null).

+0

Potete precisare come questa espressione regolare dovrebbe essere usata nel caso dell'OP? –

+0

@dystroy 'precise' non è un verbo, ma guardando il tuo profilo vedo che devi parlare francese. – jackcogdill

+0

@dystroy Non ti capisco. Che OP significa? Se stai chiedendo un esempio di come usare la regex in/con un programma vediamola. Il contenuto di un file: ciao = mondo hell0 == w0rld bye = == crudeli mondo by3 == cru3l = w0rld = == === – Ole

Problemi correlati