2011-11-24 22 views
6

tôi đang trải qua câu hỏi này C#, Regex.Match whole wordsBiểu thức Regex để khớp toàn bộ từ với các ký tự đặc biệt không hoạt động?

Nó nói cho trận đấu toàn bộ từ sử dụng "\ bpattern \ b" này hoạt động tốt cho trận đấu toàn bộ từ mà không cần bất kỳ ký tự đặc biệt vì nó có nghĩa là cho các ký tự chữ!

Tôi cần một cụm từ để đối sánh các từ với các ký tự đặc biệt. Mã của tôi như sau

class Program 
{ 
    static void Main(string[] args) 
    { 
     string str = Regex.Escape("Hi temp% dkfsfdf hi"); 
     string pattern = Regex.Escape("temp%"); 
     var matches = Regex.Matches(str, "\\b" + pattern + "\\b" , RegexOptions.IgnoreCase); 
     int count = matches.Count; 
    } 
} 

Nhưng nó không thành công vì%. Chúng ta có cách giải quyết nào cho việc này không? Có thể có các ký tự đặc biệt khác như 'dấu cách', '(', ')', v.v.

Trả lời

3

Nếu mẫu có thể chứa các ký tự đặc biệt cho Regex, trước tiên hãy chạy nó qua Regex.Escape.

Điều này bạn đã làm, nhưng làm không phải thoát khỏi chuỗi mà bạn tìm kiếm thông qua - bạn không cần điều đó.

+0

Đúng, nhưng không phải lý do (chỉ) cho vấn đề của anh ấy. –

5

Nếu bạn có các ký tự không phải từ, bạn không thể sử dụng \b. Bạn có thể sử dụng sau đây

@"(?<=^|\s)" + pattern + @"(?=\s|$)" 

Sửa: Như Tim nêu trong ý kiến, regex của bạn là không chính xác vì \b chưa tương xứng với ranh giới giữa % và trắng-không gian bên cạnh nó vì cả hai trong số đó là phi ký tự từ. \b chỉ khớp với ranh giới giữa ký tự từ và ký tự không phải từ.

Xem thêm về ranh giới từ here.

Giải thích

@" 
(?<=  # Assert that the regex below can be matched, with the match ending at this position (positive lookbehind) 
       # Match either the regular expression below (attempting the next alternative only if this one fails) 
    ^   # Assert position at the beginning of the string 
    |   # Or match regular expression number 2 below (the entire group fails if this one fails to match) 
     \s   # Match a single character that is a “whitespace character” (spaces, tabs, and line breaks) 
) 
temp%  # Match the characters “temp%” literally 
(?=   # Assert that the regex below can be matched, starting at this position (positive lookahead) 
       # Match either the regular expression below (attempting the next alternative only if this one fails) 
     \s   # Match a single character that is a “whitespace character” (spaces, tabs, and line breaks) 
    |   # Or match regular expression number 2 below (the entire group fails if this one fails to match) 
     $   # Assert position at the end of the string (or before the line break at the end of the string, if any) 
) 
" 
+1

Chính xác hơn, nếu bạn có các ký tự không phải chữ và số là phần bắt đầu hoặc kết thúc của từ tìm kiếm, bạn không thể sử dụng '\ b' bởi vì neo đó khớp với ký tự alnum và ký tự không phải là một số không. –

+0

@Yadala - Đơn giản chỉ cần tuyệt vời! Hầu như ở đó, ngoại trừ việc nó có một vấn đề. Giả sử chuỗi là "Hi này là stackoverflow" và mô hình là "này", sau đó nó nói không phù hợp. Điều này xảy ra vì không gian trống sau chuỗi thực tế trong mẫu. Làm thế nào chúng ta có thể xử lý này? Lý tưởng nhất nói nó nên nói một trận đấu được tìm thấy! – GuruC

+0

@GuruC Nếu bạn có khoảng trống trong chuỗi tìm kiếm của mình, làm thế nào nó vẫn có thể là tìm kiếm toàn bộ từ? Tôi chỉ cần xác minh điều này trong Notepad ++, nếu tôi chọn tìm kiếm toàn bộ từ và tìm kiếm "này" trong "Hi đây là stackoverflow" .. nó không cung cấp cho bất kỳ trận đấu. –

1
output = Regex.Replace(output, "(?<!\w)-\w+", "") 
output = Regex.Replace(output, " -"".*?""", "") 
Các vấn đề liên quan