2009-04-08 6 views
11

EDIT: Czy ktoś może mi pomóc z wyrażenia regularnego do ciągu znaków takich jak to ?:Jak podzielić łańcuch przez "," chyba że "," jest w nawiasach przy użyciu Regex?

[Header 1], [Head,er 2], Header 3

tak, że mogę podzielić ten na kawałki jak:

[Header 1]
[Head,er 2]
Header 3

Dotarło do mnie tak daleko:

(?<=,|^).*?(?=,|$) 

Który da mi:

[Header 1]
[Head
,er 2]
Header 3

+0

W jaki sposób człowiek potrzebuje implementacji CSV? –

+0

Czy to jest zadanie domowe?Ponieważ łatwiej jest po prostu użyć zwykłej starej manipulacji - w zasadzie: dla każdego znaku: jeśli char jest przecinkiem, a nie wewnątrz nawiasu klamrowego, dodaj bieżący ciąg do listy –

Odpowiedz

15

W tym przypadku łatwiej jest podzielić na ograniczniki (przecinki) niż dopasować tokeny (lub kawałki). Identyfikacja przecinki, które są ograniczniki zajmuje stosunkowo prosty uprzedzona:

,(?=[^\]]*(?:\[|$)) 

każdym razem znajdziesz przecinek, zrobisz uprzedzona do jednej z trzech rzeczy. Jeśli znajdziesz pierwszy kwadratowy nawias zamykający, przecinek znajduje się wewnątrz pary nawiasów, więc nie jest ogranicznikiem. Jeśli znajdziesz nawias otwierający lub koniec linii/łańcucha, jest to ogranicznik.

+0

Ah I zobacz, mogę zastąpić przecinki innym specjalnym znakiem i podzielić dokładnie używając tego. To zadziała dla mnie! Dzięki! – Nate

+0

Działa to idealnie, o ile nie ma nawiasu zagnieżdżonego. Na przykład działa zgodnie z oczekiwaniami dla '[a], [b], [c [d, e]]' ale kończy się niepowodzeniem w '[a], [b], [c, [d, e]]'. Pasuje do przecinka znajdującego się obok c w ostatnim przykładzie. Jak można to poprawić, aby nie pasowało to również? – matte

+0

Właściwie, aby być bardziej precyzyjnym dla '[a], [b, []' dopasowuje przecinek po b. Jeśli w nawiasach kwadratowych znajduje się nawias otwierający, ten wzór pasuje do przecinka w nawiasach. – matte

1

Czy to nie jest takie proste?

(?<=,|^)(?:[^,]|\[[^[]*\])* 
+0

Kiedy używam Twojego wyrażenia regularnego, otrzymuję następującą formę z narzędzi programistycznych: 'regex =/(? <=, | ^) (?: [^,] | \ [[^ [] * \]) */ SyntaxError: Nieprawidłowe wyrażenie regularne:/(? <=, | ^) (?: [^,] | \ [[^ [] * \]) * /: Nieprawidłowa grupa' – starbeamrainbowlabs

2
(?<=,|^)\s*\[[^]]*\]\s*(?=,|$) 

użyć [ i ] ograniczniki na swoją korzyść

6
\[.*?\] 

Zapomnij o przecinki, nie dbają o nich. :)

+0

Dobra odpowiedź, ale zmienił to pytanie na ciebie ... – dmckee

+0

Cóż, teraz jestem zdezorientowany. Czy naprawdę mówi Header czy jest to jakiś symbol zastępczy? Czy nawiasy są tam naprawdę czy opcjonalne? Stało się teraz mylące, co to są poprawne ciągi wejściowe. –

+0

Przepraszamy za zmianę, Poprawne ciągi wejściowe to [Some Text], Some More Text, [Yet mo, re Text] ... podzielone na [Some Text]/Some more Text/[Yet mo, re Text] – Nate

1

Można użyć wyrażenia regularnego, aby dopasować wartości w nawiasie:

\[[^\]*]\] 

Albo użyć tego wyrażenia regularnego, aby podzielić listę wspornik (używając przeglądowej wokół twierdzeń):

(?<=]|^)\s*,\s*(?=\[|$)