2009-07-23 168 views
24

OK, chương trình này là lái xe cho tôi hạt .... Tôi có một chuỗi mà được hình thành như sau:Regex phù hợp với một ( n) xuống dòng trong C#

var newContent = string.Format("({0})\n{1}", stripped_content, reply) 

newContent sẽ hiển thị như sau:
(văn bản cũ)
văn bản mới

Tôi cần cụm từ thông dụng tách văn bản giữa các dấu ngoặc đơn với dấu ngoặc đơn và ký tự dòng mới.

Điều tốt nhất tôi có thể đưa ra là:

const string regex = @"^(\(.*\)\s)?(?<capture>.*)"; 
var match= Regex.Match(original_content, regex); 
var stripped_content = match.Groups["capture"].Value; 

này hoạt động, nhưng tôi muốn đặc biệt để phù hợp với dòng mới (\n), chứ không phải bất kỳ khoảng trắng (\s) Thay \s với \n\\n hoặc \\\n làm Không làm việc.

Hãy giúp tôi giữ sự tỉnh táo của mình!

EDIT: một ví dụ:

public string Reply(string old,string neww) 
     { 
      const string regex = @"^(\(.*\)\s)?(?<capture>.*)"; 
      var match= Regex.Match(old, regex); 
      var stripped_content = match.Groups["capture"].Value; 
      var result= string.Format("({0})\n{1}", stripped_content, neww); 
      return result; 
     } 

Reply("(messageOne)\nmessageTwo","messageThree") returns : 
(messageTwo) 
messageThree 
+0

Bạn có thể đăng chương trình ngắn nhưng đầy đủ để chứng minh sự cố không? Tôi đang tìm thấy nó khó khăn để mảnh với nhau vào lúc này. –

Trả lời

54

Nếu bạn chỉ định RegexOptions.Multiline thì bạn có thể sử dụng ^$ để khớp với phần đầu và cuối của một dòng tương ứng.

Nếu bạn không muốn sử dụng tùy chọn này, hãy nhớ rằng một dòng mới có thể bất kỳ một trong các cách sau: \n, \r, \r\n, nên thay vì tìm kiếm chỉ dành cho \n, bạn có lẽ nên sử dụng một cái gì đó như: [\n\r]+ hoặc chính xác hơn: (\n|\r|\r\n).

+17

Đừng quên rằng thay đổi không phải là tham lam; nếu bạn áp dụng regex của bạn vào '" \ r \ n "' nó sẽ chỉ khớp với '" \ r "'. Tôi sẽ sử dụng '(\ n | \ r \ n?)' Hoặc có thể '(\ r \ n? | \ N)' thay thế. –

+0

Tôi không thể làm cho nó hoạt động với tùy chọn Đa cấp. (\ n | \ r | \ r \ n) đã thực hiện thủ thuật. Nó xuất hiện trong trường hợp cụ thể này là \ r \ n là cần thiết để có được một kết quả phù hợp, mặc dù tôi chỉ chèn \ n vào chuỗi để khớp. – Dabblernl

+0

@AlanMoore cảm ơn vì điều đó. Tôi đã nhầm lẫn tại sao '\ r \ n' khớp với hai lần. – ToastyMallows

3

Nếu bạn đang cố gắng để phù hợp với kết thúc dòng sau đó bạn có thể tìm thấy

Regex.Match("string", "regex", RegexOptions.Multiline) 

giúp

+1

xin lỗi, điều đó không hoạt động – Dabblernl

4

Bạn có lẽ sẽ có một \ r trước \ n của bạn. Hãy thử thay thế \ s bằng (\ r \ n).

15

acctually nó hoạt động nhưng với tùy chọn đối diện ví dụ:

RegexOptions.Singleline 

:-)

+1

đẹp! đã sửa nó cho tôi! bằng cách nào đó, dòng kết thúc không được bỏ qua bằng cách sử dụng tùy chọn đa dòng. nhưng với một dòng đã làm nó! +1 – Yustme

+0

Cảm ơn gợi ý này, đầu vào nhiều dòng được xử lý tốt ở chế độ 'Singleline' ... nhưng hành vi khác và đôi khi hành vi' Singleline' là những gì bạn cần! tôi biết đầu vào của tôi là đa dòng, vì vậy tôi không thực sự nghĩ về nó đặt tùy chọn 'Multiline' ... nhưng trong trường hợp này' .' (dấu chấm) không khớp với newline char (s) mà là những gì tôi thực sự truy nã. Đặt thành 'Singleline' đã khắc phục sự cố này. '$' trong các trường hợp đó khớp với phần cuối của chuỗi đầu vào cũng thuận tiện. Vì vậy, bài học kinh nghiệm: đầu vào nhiều dòng không phải lúc nào cũng có nghĩa là tùy chọn 'Multiline' nên được sử dụng! – TCC

+0

Tôi không biết đây có phải là những gì OP muốn hay không nhưng đó là điều tôi muốn! Đó là tìm kiếm văn bản cho regex của tôi và, có hiệu quả, bỏ qua nguồn cấp dữ liệu dòng. Cảm ơn. – glaucon

3

nghĩ tôi có thể là một chút muộn để đảng, nhưng vẫn hy vọng điều này sẽ giúp.

Tôi cần có nhiều mã thông báo giữa hai dấu hiệu băm.

Ví dụ i/p:

## token1 ##
## token2 ##
## token3_a
token3_b
token3_C##

Điều này dường như làm việc trong trường hợp của tôi:

var matches = Regex.Matches (mytext, "##(.*?)##", RegexOptions.Singleline);

Tất nhiên, bạn có thể muốn thay thế các dấu hiệu băm đôi ở cả hai đầu bằng ký tự của riêng bạn.

HTH.

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