2011-01-24 3 views
10

Potrzebuję podzielić ciąg jak poniżej, na podstawie spacji jako ogranicznika. Ale każda przestrzeń wewnątrz cytatu powinna zostać zachowana.Regex split string zachowując cytaty

research library "not available" author:"Bernard Shaw" 

do

research 
library 
"not available" 
author:"Bernard Shaw" 

Staram się zrobić to w C Sharp Mam tego wyrażenia regularnego: @"(?<="")|\w[\w\s]*(?="")|\w+|""[\w\s]*""" z innego wątku w SO, która dzieli ciąg do

research 
library 
"not available" 
author 
"Bernard Shaw" 

który Niestety nie spełnia moich dokładnych wymagań.

Szukam jakiegokolwiek Regexa, to by załatwiło sprawę.

Każda pomoc doceniona.

Odpowiedz

25

Dopóki nie może być uciekł cytowany wewnątrz cudzysłowami, następujące powinny działać:

splitArray = Regex.Split(subjectString, "(?<=^[^\"]*(?:\"[^\"]*\"[^\"]*)*) (?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)"); 

Ten regex podziały na spacje tylko wtedy, gdy są one poprzedzony oraz zakończony parzystej liczbie cytatów.

regex bez tych wszystkich uciekł cytaty, wyjaśnił:

(?<=  # Assert that it's possible to match this before the current position (positive lookbehind): 
^  # The start of the string 
[^"]* # Any number of non-quote characters 
(?:  # Match the following group... 
    "[^"]* # a quote, followed by any number of non-quote characters 
    "[^"]* # the same 
)*  # ...zero or more times (so 0, 2, 4, ... quotes will match) 
)   # End of lookbehind assertion. 
[ ]  # Match a space 
(?=  # Assert that it's possible to match this after the current position (positive lookahead): 
(?:  # Match the following group... 
    [^"]*" # see above 
    [^"]*" # see above 
)*  # ...zero or more times. 
[^"]* # Match any number of non-quote characters 
$  # Match the end of the string 
)   # End of lookahead assertion 
+0

Jak podzielić to kropki, znaki zapytania, exclama znaczniki itd. zamiast spacji. Próbuję uzyskać każde zdanie, jeden po drugim, z wyjątkiem cytatów. Na przykład: Walked. ** Odwrócił się. ** Ale dlaczego? ** I powiedział: "Witaj świecie. Cholera, ten ciąg rozdzielający rzeczy!" bez wstydu. ** – ErTR

+1

@ ErtürkÖztürk: To zasługuje na własne pytanie StackOverflow - zbyt duże, by można było na nie odpowiedzieć. –

+1

@TimPietzcker cóż, nie wiem dlaczego, ale zadałem prawie to samo pytanie (http://stackoverflow.com/questions/33886103/how-to-find-recurring-word-groups-in-text-with-c) i Mam zbyt wiele reakcji, jak "nie jest to usługa pisania kodu" lub "nie jest jasne", więc próbuję swojej szansy w komentarzach. – ErTR

3

Proszę bardzo:

C#:

Regex.Matches(subject, @"([^\s]*""[^""]+""[^\s]*)|\w+") 

Wyrażenie regularne:

([^\s]*\"[^\"]+\"[^\s]*)|\w+ 
+0

Heh, nie zauważyłem odpowiedzi Tima. To zadziała w przypadku dzielenia, to jest dopasowanie. –

+0

Dzięki Jivlain, działa również doskonale, do dopasowania. – itsbalur