2012-01-12 39 views
6

Tôi đang cố gắng tìm ra cách xóa tất cả văn bản trong chuỗi trước khi khớp trong Regex. Tôi đang mã hóa điều này trong C#. Ví dụ, nếu chuỗi là "hello, test matching", và pattern là "test", tôi muốn kết quả cuối cùng là "test matching" (nghĩa là xóa mọi thứ trước khi test).Regex + Xóa tất cả văn bản trước khi khớp

Mọi suy nghĩ? Cảm ơn!

CHỈNH SỬA: Có lẽ tôi nên cụ thể hơn một chút trong ví dụ của tôi sau khi đọc câu trả lời của bạn (và cảm ơn họ). Tôi thích phương pháp lookahead, nhưng tôi đã đơn giản hóa ví dụ của mình. Để làm cho mọi việc khó khăn hơn, thường là chuỗi trông giống như:

"hello, kết hợp kiểm tra thử nghiệm everythingAfter"

Vì vậy, nếu tôi sử dụng mô hình "test", nó sẽ bắt đầu tiên. Mục đích của tôi là thay thế tất cả văn bản sau trận đấu thứ hai. Tức là: kết quả là "test everythingAfter" .... Xin lỗi về điều đó.

+2

Tôi không đủ quen thuộc với C# để viết mã. Tuy nhiên, không sử dụng RegEx, sử dụng các phương thức chuỗi cơ bản. * tìm kiếm * để tìm sự xuất hiện, hơn là sử dụng * chuỗi con * chụp * mọi thứ sau *. –

+0

Đối với các mẫu bạn đang cố gắng xóa, chúng có luôn luôn là chuỗi hoặc đôi khi chúng là biểu thức chính quy thực tế không? Nếu trước đây, sử dụng 'IndexOf' và' Chuỗi con' và tránh các hình phạt về hiệu suất mà bạn không cần. –

+0

Có thể trùng lặp: [Xóa văn bản khỏi chuỗi cho đến khi nó đạt đến một ký tự nhất định] (http://stackoverflow.com/q/8371922/299327) –

Trả lời

0

* Cập nhật, sử dụng matchcollection

string test = "hello, test matching"; 

string regexStrTest; 
regexStrTest = @"test\s\w+";  
MatchCollection m1 = Regex.Matches(test, regexStrTest); 
//gets the second matched value 
string value = m1[1].Value; 
+0

xem chỉnh sửa (và nhận xét) ở trên – keynesiancross

+0

Đó là một * lookbehind *, không phải là một lookahead, và nó không làm bất cứ điều gì hữu ích. Nếu '" test \ s "' vừa mới tiêu thụ 'test' theo sau là một dấu cách, thì dĩ nhiên một lookbehind cho' "test" 'sẽ thành công. Ngoài ra, tùy chọn 'Singleline' không có hiệu lực bởi vì metacharacter' .' ​​không được sử dụng trong regex. –

+0

Đã cập nhật! Giải pháp không giải quyết được câu hỏi. – Standage

5

Đối với một giải pháp đơn giản, chỉ cần thay thế "bắt đầu-of-line bất cứ điều gì thử nghiệm" với "test":

newString = Regex.Replace(oldString, "^.*test", "test"); 

Kể từ * là tham lam, điều này sẽ thay thế càng nhiều càng tốt, tức là a test b test c sẽ trở thành test c. Để thay thế ít nhất có thể, hãy sử dụng *? thay vì *.

Nếu bạn muốn tránh sao chép từ tìm kiếm, bạn có thể sử dụng một Zero-width positive lookahead assertion:

newString = Regex.Replace(oldString, "^.*(?=test)", ""); 
+0

Thao tác này sẽ xóa mọi thứ trước kết quả * cuối cùng * của 'kiểm tra'. Nó có thể không quan trọng trong nhiều trường hợp, nhưng nó cũng có thể gây nhầm lẫn. – svick

+0

Trên thực tế, khi tôi đọc xuống câu trả lời ngay bây giờ, đây chính xác là những gì tôi cần làm (xem chỉnh sửa của tôi ở trên). Tôi cần nó để phù hợp với kết quả cuối cùng, và thay thế tất cả mọi thứ trước khi nó. Cảm ơn rất nhiều. – keynesiancross

+0

@keynesiancross: Nếu đúng như vậy, bạn nên chấp nhận câu trả lời này hoặc câu trả lời từ Heinzi, * không * của Paul. Không có gì cá nhân, Paul, nhưng điều đó chỉ hoạt động một cách tình cờ. –

7

Bạn có thể sử dụng positive lookahead để phù hợp với một chuỗi nhưng không nắm bắt nó:

(?=test) 

Vì vậy, bạn muốn để nắm bắt nội dung trước lần xuất hiện thử nghiệm cuối cùng:

^.*(?=test) 

Nếu bạn muốn làm cho nó để nó là sự xuất hiện đầu tiên của kiểm tra, sử dụng phù hợp với lười biếng:

^.*?(?=test) 
+0

Thx cho phản hồi - thực hiện một chỉnh sửa cho vấn đề trên ... Tôi thích cách tiếp cận lookahead đó. Tôi có thể chọn trận đấu thứ 2 và sau đó nhìn về phía trước? – keynesiancross

+0

Bạn sẽ nắm bắt mọi thứ sau khi xảy ra như thế nào? – user1040975

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