2011-01-24 35 views
10

Aşağıdaki gibi bir dizeyi ayırıcı olarak boşluklara göre ayırmam gerekiyor. Ancak teklif içindeki herhangi bir alan korunmalıdır.Regex bölünmüş dize koruma tırnakları

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

C Sharp bunun çalışıyorum

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

için, bu normal ifadeyle vardır: @"(?<="")|\w[\w\s]*(?="")|\w+|""[\w\s]*"""

research 
library 
"not available" 
author 
"Bernard Shaw" 

içine dize böler SO başka yazı, gelen hangi maalesef benim kesin şartlara uymuyor.

Regex'i arıyorum, bu işe yarar.

Herhangi bir yardım için teşekkür ederiz.

cevap

25

sürece hiçbir tırnaklı dizge içinde alıntı kurtuldu olabilir gibi, aşağıdaki çalışması gerekir: bunlar tırnak eşit sayıda öncesinde ve uyulması gerekir uzay karakterler

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

Bu regex böler.

tüm bu olmadan regex, tırnak kaçan açıkladı: İşte

(?<=  # 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

nasıl bölmek noktalar, soru işaretleri, exclama ile boşluklar yerine vb. Alıntıların dışında her bir cümleyi tek tek almaya çalışıyorum. Örneğin: Yürüdü. ** Geri döndü. ** Ama neden? ** Ve “Merhaba dünya.” Dedi. Bir utanmadan. ** – ErTR

+1

@ ErtürkÖztürk: Bu kendi StackOverflow sorusuna layıktır - bir yorumda yanıtlanamayacak kadar büyük. –

+1

@TimPietzcker neden bilmiyorum ama neredeyse aynı soruyu sordum (http://stackoverflow.com/questions/33886103/how-to-find-recurring-word-groups-in-text-with-c) ve "Kod yazma hizmeti yok" ya da "net değil" gibi çok fazla tepkim var, bu yüzden yorumlarda şansımı deniyorum. – ErTR

3

gitmek:

C#:

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

Düzenli ifade:

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

Heh, Tim'in cevabını fark etmedi. Bu bölme için çalışır, bu eşleştirme içindir. –

+0

Teşekkürler Jivlain, eşleme için mükemmel bir şekilde çalışıyor. – itsbalur