2011-08-10 36 views
10

Tôi phải phân tích cú pháp văn bản ở đó với là từ khóa nếu từ đó không được bao quanh bởi các dấu ngoặc vuông. Tôi phải đối sánh từ khóa với. Ngoài ra, phải có các ranh giới từ ở cả hai bên của với.Regex để khớp một chuỗi KHÔNG được bao quanh bởi các dấu ngoặc đơn

Dưới đây là một số ví dụ nơi với KHÔNG phải là một từ khóa:

  • [với]
  • [với]
  • [sometext với sometext]
  • [sometext với]
  • [với sometext]

Dưới đây là một số ví dụ nơi với LÀ từ khóa

  • với
  • ] với
  • chào với
  • chào với thế giới
  • chào [thế giới] với chào
  • chào [thế giới] với hello [world]

Bất kỳ ai lp? Cảm ơn trước.

Trả lời

17

Bạn có thể tìm kiếm từ with và thấy rằng khung gần nhất với mặt trái của nó không phải là một dấu ngoặc mở, và khung gần phía bên phải của nó không phải là một khung bế mạc:

Regex regexObj = new Regex(
    @"(?<!  # Assert that we can't match this before the current position: 
    \[  # An opening bracket 
    [^[\]]* # followed by any other characters except brackets. 
    )   # End of lookbehind. 
    \bwith\b # Match ""with"". 
    (?!  # Assert that we can't match this after the current position: 
    [^[\]]* # Any text except brackets 
    \]  # followed by a closing bracket. 
    )   # End of lookahead.", 
    RegexOptions.IgnorePatternWhitespace); 
Match matchResults = regexObj.Match(subjectString); 
while (matchResults.Success) { 
    // matched text: matchResults.Value 
    // match start: matchResults.Index 
    // match length: matchResults.Length 
    matchResults = matchResults.NextMatch(); 
} 

Các biểu thức nhìn chung không dừng lại ở ngắt dòng; nếu bạn muốn mỗi dòng được đánh giá riêng biệt, hãy sử dụng [^[\]\r\n]* thay vì [^[\]]*.

+0

@Tim: Giải pháp của bạn thực sự đã giúp tôi rất nhiều. Bây giờ tôi có vấn đề tương tự, chỉ có vậy, các dấu ngoặc sẽ được thay thế bằng dấu ngoặc kép. Tôi có nghĩa là "đôi khi với một chút", không phải là một từ khóa. Tôi đã cố gắng để thay thế dấu ngoặc kép với dấu ngoặc kép nhưng nó không hoạt động. Tôi thực sự quá tệ trong Regex, tôi cần sự giúp đỡ của bạn một lần nữa. Cảm ơn :) – Mohayemin

+0

@Mohaimin, hãy xem [câu hỏi này] (http://stackoverflow.com/questions/6111749/replace-whitespace-outside-quotes-using-regular-expression/6112179#6112179) mà là về rất giống nhau vấn đề; chỉ cần thay thế phần '[\]' trong regex bằng '\ bwith \ b', và bạn nên làm tốt. –

+0

@Tim: Cảm ơn, điều đó thật hoàn hảo. Tôi chỉ cần sửa đổi một chút bởi vì tôi phải hợp nhất regex với câu hỏi bạn đã đưa ra ở trên. Nó hoạt động tốt: D – Mohayemin

0

Bạn sẽ muốn xem xét cả hai giao diện tiêu cực và những cái nhìn tiêu cực, điều này sẽ giúp bạn đối sánh dữ liệu của mình mà không cần phải sử dụng dấu ngoặc vuông.

3

Câu hỏi hay. Tôi nghĩ sẽ dễ dàng hơn khi tìm các kết quả phù hợp khi áp dụng mẫu [with] của bạn và sau đó đảo ngược kết quả.

Bạn cần phải phù hợp [, không tiếp theo ], tiếp theo là with (và sau đó là mô hình tương ứng cho khung vuông khép kín)

Phù hợp với [with là dễ dàng.

\[with 

thêm một lookahead để loại trừ ], và cũng cho phép bất kỳ số lượng các nhân vật khác (.*)

\[(?!]).*with 

thì tương ứng đóng khung vuông, ví dụ ngược lại với một lookbehind.

\[(?!]).*with.*\](?<1[) 

một chút tinh chỉnh

\[(?!(.*\].*with)).*with.*\](?<!(with.*\[.*)) 

và bây giờ nếu bạn đảo ngược vùng này, bạn nên có kết quả mong muốn của bạn. (tức là khi điều này trả về 'true', mẫu của bạn phù hợp và muốn loại trừ các kết quả đó).

1

Tôi nghĩ giải pháp đơn giản nhất là kết hợp trước các cặp ngoặc vuông cân bằng và nội dung của chúng để tránh chúng khỏi khi bạn tìm kiếm từ khóa. Dưới đây là ví dụ:

string s = 
    @"[with0] 
    [ with0 ] 
    [sometext with0 sometext] 
    [sometext with0] 
    [with0 sometext] 


    with1 
    ] with1 
    hello with1 
    hello with1 world 
    hello [ world] with1 hello 
    hello [ world] with1 hello [world]"; 

Regex r = new Regex(@"\[[^][]*\]|(?<KEYWORD>\bwith\d\b)"); 
foreach (Match m in r.Matches(s)) 
{ 
    if (m.Groups["KEYWORD"].Success) 
    { 
    Console.WriteLine(m.Value); 
    } 
} 
+0

Upvoting này, đẹp Alan. :) Tin hay không, tôi đã chỉ nhìn thấy 3 câu hỏi khác trên SO sử dụng kỹ thuật này, mặc dù nhìn vào nhiều vấn đề tương tự. – zx81

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