2013-01-08 5 views
6

Oto przypadek:dzielona przez postać w JavaScript, ale nie przylegające do siebie te

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

wyjściowa:

hello,goodbye,,hello 

muszę tego wyjścia:

hello,goodbye==hello 

Sąsiadujące/powtórzonych znaków należy go zignorować, po prostu zrób singiel "=", aby podzielić.

Może trochę regex?

+1

Czy zawsze będą znaki alfanumeryczne wokół '=' s, które chcesz podzielić? A może może być coś takiego jak "hello: =! Goodbye", które powinno zostać podzielone na 'hello:' i '! Goodbye'? –

Odpowiedz

6

Można użyć wyrażenia regularnego:

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

\b kontrole na granicy słów.

+0

Myślę, że tylko znaki równości powinny być ignorowane, a nie jakikolwiek znak nie-słowny. – Bergi

+0

@Bergi Nie jestem pewien, czy widzę twój problem. Czy możesz wymyślić przykład? –

+0

Dzięki, świetne rozwiązanie! –

3

Najprawdopodobniej odpowiedź @dystroys jest tą, której szukasz. Ale jeśli dowolne znaki inne niż znaki alfanumeryczne (A-Z, a-z, 0-9 lub _) mogą otaczać "podział ="), to jego rozwiązanie nie będzie działać. Na przykład ciąg

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

będzie podzielony na

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

Więc jeśli chcesz tego uniknąć, normalnie można użyć lookbehind twierdzenie:

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

Więc chociaż będzie tylko podzielone na pojedyncze = s, nie można go używać, ponieważ JavaScript nie obsługuje modelu (?<!...) lookbehind twierdzenie.

Na szczęście zawsze można przekształcać operacji split() w globalnej match() pracy dopasowując wszystko, co pozwoliło między ograniczniki:

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

daje

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

+1 Zastanawiam się, dlaczego funkcja lookbehind w testowanym "split" nie działa. Czy "nie działa w JavaScript!" udokumentowane gdzieś? –

+0

@dystroy: http://www.regular-expressions.info/refflavors.html jest moim źródłem informacji (lub RegexBuddy). –

+2

'match' zwykle nie jest równoznaczne z' split' w sposobie obsługi ciągów rozpoczynających/kończących się ogranicznikami. Ponadto może zwrócić 'null'. Transformacja nie jest trywialna :-) A przynajmniej trzeba by użyć '*' zamiast '+' – Bergi

-1

Jako pierwsze przybliżenie się do możliwe rozwiązanie to:

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

Należy pamiętać, że jest to tylko wyrażenie regularne, jeśli chcesz używać go z egrep, sed, regex java lub cokolwiek innego, zachowaj ostrożność, jeśli coś musi zostać usunięte.

UWAGA! To jest pierwsze przybliżenie, które można poprawić. Zwróć uwagę, że na przykład to wyrażenie regularne nie będzie pasowało do tego ciągu "=" (null - równy - null).

+0

Czy możesz sprecyzować, w jaki sposób należy używać tego wyrażenia w przypadku OP? –

+0

@dystroy 'precise' nie jest czasownikiem, ale patrząc na twój profil widzę, że musisz mówić po francusku. – jackcogdill

+0

@dystroy Nie rozumiem cię. Co oznacza OP? Jeśli pytasz o przykład użycia tego wyrażenia regularnego w/z programem, zobaczmy to. Zawartość pliku: cześć = świat hell0 == w0rld bye = == okrutny świat by3 == cru3l = w0rld = == === – Ole

Powiązane problemy