2012-07-23 24 views
14

Làm cách nào để tôi có thể tìm kewords không nằm trong chuỗi.từ khóa đối sánh regex không có trong dấu ngoặc kép

Ví dụ nếu tôi có các văn bản:

Xin chào văn bản này là một ví dụ.

bla bla bla "text này là bên trong một chuỗi"

"chuỗi ngẫu nhiên" hơn văn bản bla bla bla "foo"

tôi sẽ thích để có thể phù hợp với tất cả các từ text rằng không nằm trong số " ". Trong khác tôi sẽ thích để phù hợp:

enter image description here

lưu ý tôi không muốn để phù hợp với văn bản được đánh dấu trên màu đỏ vì nó là bên trong một chuỗi


giải pháp có thể:

Tôi đang nghiên cứu và đây là những gì tôi có cho đến thời điểm này:

(?s)((?<q>")|text)(?(q).*?"|)

lưu ý rằng regex sử dụng câu lệnh if như sau: (? (Predicate) thay thế đúng | thay thế false)

nên regex sẽ đọc:

tìm "hoặc văn bản. Nếu bạn tìm thấy "sau đó tiếp tục chọn cho đến khi bạn tìm thấy" một lần nữa (. *? ") Nếu bạn tìm thấy văn bản sau đó không làm gì cả ...

khi tôi chạy rằng regex tôi phù hợp với toàn bộ chuỗi mặc dù. Tôi yêu cầu này Tôi biết tôi có thể loại bỏ tất cả các chuỗi sau đó tìm những gì tôi cần

+0

Bạn đã thử một trình tạo regex trực tuyến chẳng hạn như: http://txt2re.com/index-csharp.php3 – Surfbutler

+2

Tại sao bạn muốn khớp một chuỗi mà bạn biết là gì? Bạn dự định làm gì với kết quả. Ý định quan trọng đối với những người khác để có thể đưa ra một câu trả lời thích hợp. – Mithon

+0

Bạn không cần biết mục đích của câu hỏi để có thể trả lời câu hỏi đó. Ngoài ra bạn đang giả định rằng anh ta biết chuỗi là gì. Ông chỉ đưa ra các ví dụ để chứng minh những gì ông đang cố gắng làm và những người không nhất thiết là những gì ông sẽ được sử dụng cuối cùng.He đang tìm kiếm một kết quả cụ thể và nó không phải là kinh doanh của chúng tôi về cách kết quả đó sẽ được sử dụng. –

Trả lời

20

Đây là một câu trả lời:

(?<=^([^"]|"[^"]*")*)text 

Điều này có nghĩa:

(?<=  # preceded by... 
^   # the start of the string, then 
([^"]  # either not a quote character 
|"[^"]*" # or a full string 
)*   # as many times as you want 
) 
text  # then the text 

Bạn có thể dễ dàng mở rộng này để xử lý các chuỗi có chứa thoát.

Trong mã C#:

Regex.Match("bla bla bla \"this text is inside a string\"", 
      "(?<=^([^\"]|\"[^\"]*\")*)text", RegexOptions.ExplicitCapture); 

gia tăng từ cuộc thảo luận bình luận - phiên bản mở rộng (trận đấu trên một cơ sở cho mỗi dòng và xử lý thoát). Sử dụng RegexOptions.Multiline cho việc này:

(?<=^([^"\r\n]|"([^"\\\r\n]|\\.)*")*)text 

Trong một chuỗi C# này trông giống như:

"(?<=^([^\"\r\n]|\"([^\"\\\\\r\n]|\\\\.)*\")*)text" 

Kể từ bây giờ bạn muốn sử dụng ** thay vì " đây là một phiên bản cho rằng:

(?<=^([^*\r\n]|\*(?!\*)|\*\*([^*\\\r\n]|\\.|\*(?!\*))*\*\*)*)text 

Giải thích:

(?<=  # preceded by 
^   # start of line 
(  # either 
[^*\r\n]| # not a star or line break 
\*(?!\*)| # or a single star (star not followed by another star) 
    \*\*  # or 2 stars, followed by... 
    ([^*\\\r\n] # either: not a star or a backslash or a linebreak 
    |\\.  # or an escaped char 
    |\*(?!\*) # or a single star 
    )*   # as many times as you want 
    \*\*  # ended with 2 stars 
)*  # as many times as you want 
) 
text  # then the text 

Kể từ phiên bản này không chứa " ký tự nó sạch hơn để sử dụng một chuỗi chữ:

@"(?<=^([^*\r\n]|\*(?!\*)|\*\*([^*\\\r\n]|\\.|\*(?!\*))*\*\*)*)text" 
+0

Porges nhờ sự giúp đỡ! nếu tôi ở đâu: '" \ r \ n văn bản \ r \ n "bla bla ...' không khớp ... tôi đoán lý do là vì '[^"] 'sẽ tiếp tục tới dòng tiếp theo ... –

+1

@TonoNam: Nếu bạn muốn nó khớp trên cơ sở từng dòng thì hãy thay đổi cả '[^"] 'thành' [^ "\ r \ n]' và thêm 'RegexOptions.Multiline' vào các tùy chọn. – porges

+0

cảm ơn! Điều đó rất hữu ích –

5

Điều này có thể khá phức tạp, nhưng đây là một phương pháp tiềm năng hoạt động bằng cách đảm bảo rằng có một số dấu ngoặc kép giữa các văn bản phù hợp và kết thúc của chuỗi:

text(?=[^"]*(?:"[^"]*"[^"]*)*$) 

Thay text với regex mà bạn muốn khớp.

Rubular: http://www.rubular.com/r/cut5SeWxyK

Giải thích:

text   # match the literal characters 'text' 
(?=    # start lookahead 
    [^"]*   # match any number of non-quote characters 
    (?:   # start non-capturing group, repeated zero or more times 
     "[^"]*"  # one quoted portion of text 
     [^"]*   # any number of non-quote characters 
    )*    # end non-capturing group 
    $    # match end of the string 
)    # end lookahead 
+0

không khớp với văn bản cuối cùng. Nhưng nó rất hữu ích để biết! 1 cảm ơn vì sự giúp đỡ. –

1

tôi sẽ chỉ đơn giản là tham lam phù hợp với văn bản trong dấu ngoặc kép trong một nhóm không chụp để lọc chúng ra và sau đó sử dụng một chụp nhóm cho câu trả lời không trích dẫn, như thế này:

".*(?:text).*"|(text) 

mà bạn có thể muốn tinh chỉnh một chút cho word-ranh giới vv Nhưng điều này sẽ đưa bạn đến nơi bạn muốn đi, và trở thành một mẫu có thể đọc được rõ ràng.

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