2011-01-24 28 views
10

Tôi cần chia một chuỗi như chuỗi bên dưới, dựa trên khoảng trắng làm dấu phân cách. Nhưng bất kỳ không gian nào trong một báo giá phải được giữ nguyên.Dấu ngoặc bảo quản chuỗi phân chia Regex

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

để

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

Tôi cố gắng để làm điều này trong C Sharp, tôi có Regex này: @"(?<="")|\w[\w\s]*(?="")|\w+|""[\w\s]*""" từ một bài trong SO, mà tách chuỗi thành

research 
library 
"not available" 
author 
"Bernard Shaw" 

mà tiếc là không đáp ứng các yêu cầu chính xác của tôi.

Tôi đang tìm kiếm bất kỳ Regex nào, điều đó sẽ thực hiện thủ thuật.

Bất kỳ trợ giúp đánh giá cao.

Trả lời

25

Chừng nào không thể có trốn thoát được trích dẫn bên trong chuỗi trích dẫn, sau đây nên làm việc:

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

này regex chia tách trên những nhân vật không gian chỉ khi chúng được đi trước và theo sau là một số chẵn các dấu ngoặc kép.

Các regex mà không cần tất cả những thoát khỏi dấu ngoặc kép, giải thích:

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

Làm thế nào để chia nó với dấu chấm, dấu chấm hỏi, exclama tion nhãn hiệu vv thay vì không gian. Tôi đang cố gắng để có được mỗi câu một, ngoại trừ bên trong dấu ngoặc kép. Ví dụ: Đã đi bộ. ** Quay trở lại. ** Nhưng tại sao? ** Và nói "Xin chào thế giới. Chết tiệt cái này xâu chuỗi mọi thứ!" ** – ErTR

+1

@ ErtürkÖztürk: Điều đó xứng đáng với câu hỏi StackOverflow của chính nó - quá lớn để được trả lời trong một bình luận. –

+1

@TimPietzcker well Tôi không biết tại sao nhưng tôi đã hỏi gần như cùng một câu hỏi (http://stackoverflow.com/questions/33886103/how-to-find-recurring-word-groups-in-text-with-c) và Tôi có quá nhiều phản ứng như "đây không phải là một dịch vụ viết mã" hay "nó không rõ ràng" vì vậy tôi đang cố gắng có cơ hội nhận xét. – ErTR

3

Ở đây bạn đi:

C#:

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

thường xuyên biểu hiện:

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

Heh, không để ý câu trả lời của Tim. Điều đó sẽ làm việc để tách, điều này là để phù hợp. –

+0

Cảm ơn Jivlain, nó hoạt động hoàn hảo, để phù hợp. – itsbalur

Các vấn đề liên quan