2013-03-07 41 views
5

Tôi có một regex mà tôi đã xác minh trong 3 nguồn riêng biệt như kết hợp thành công văn bản mong muốn.C# Regex Pattern Conundrum

  1. http://regexlib.com/RETester.aspx
  2. http://derekslager.com/blog/posts/2007/09/a-better-dotnet-regular-expression-tester.ashx,
  3. http://sourceforge.net/projects/regextester/

Nhưng, khi tôi sử dụng regex trong mã của tôi. Nó không tạo ra một trận đấu. Tôi đã sử dụng regex khác với mã này và họ đã dẫn đến kết quả mong muốn. Tôi đang thua lỗ ...

string SampleText = "starttexthere\r\nothertexthereendtexthere"; 
string RegexPattern = "(?<=starttexthere)(.*?)(?=endtexthere)"; 
Regex FindRegex = new Regex(@RegexPattern); 
Match m = FindRegex.Match(SampleText); 

Tôi không biết vấn đề là regex hay mã của tôi.

Trả lời

7

Vấn đề là văn bản của bạn chứa một số \r\n có nghĩa là nó được chia thành hai dòng. Nếu bạn muốn để phù hợp với toàn bộ chuỗi bạn phải đặt option để phù hợp trên nhiều dòng, và để thay đổi hành vi của các . bao gồm (kí tự xuống dòng) \n trong lần xuất hiện

Regex FindRegex = new Regex(@RegexPattern, RegexOptions.Multiline | RegexOptions.Singleline); 
+0

Đã thử. Regex.Match (SampleText, @RegexPattern, RegexOptions.Multiline) .Groups [1] .Value.ToString() trả về một chuỗi trống – s15199d

+0

nếu bạn bao gồm RegexOptions.Multiline | RegexOptions.Singleline cũng như –

+0

Cảm ơn Miky! Nó cần cả Multiline và Singleline. – s15199d

0

Bạn don' t cần RegexOptions.Multiline.

Sự cố trong trường hợp của bạn là dấu chấm khớp với bất kỳ ký tự nào ngoại trừ ký tự ngắt dòng (\r\\n).

Vì vậy, bạn cần phải xác định mẫu regex của mình như sau: (?<=starttexthere)[\w\r\n]+(?=endtexthere) để đối sánh cụ thể văn bản trên các ngắt dòng.

Đây là mẫu đang chạy trực tuyến: http://ideone.com/ZXgKar

+0

Điều đó không khớp với http://regexlib.com/RETester.aspx – s15199d

+0

@ s15199d có, nó * không * khớp. Ngoài ra, mã trong liên kết ideone hoạt động. – GolfWolf