2010-03-30 36 views
6

Tôi có read để khớp với một từ bên trong chuỗi bằng cách sử dụng Cụm từ thông dụng (trong .NET), tôi có thể sử dụng từ định danh biên (\b) trong regex. Tuy nhiên, không có cuộc gọi nào trong số các cuộc gọi này dẫn đến bất kỳ trận đấu nàoRất đơn giản regex không hoạt động

Regex.Match("INSERT INTO TEST(Col1,Col2) VALUES(@p1,@p2)", @"\[email protected]\b"); 

Regex.Match("INSERT INTO TEST(Col1,Col2) VALUES(@p1,@p2)", @"\bINSERT\b"); 

Tôi có làm gì sai không?

EDIT: được thứ hai đã làm việc;)

Trả lời

9

Cập nhật: Như another answer chỉ ra, @ không phải là một nhân vật từ như vậy không có ranh giới từ giữa @ và không gian. Là một khắc phục, bạn thay vì có thể sử dụng một negative lookbehind:

@"(?<!\w)@p1\b" 

Original câu trả lời: Bạn cần một @ trước cụm từ thông dụng:

@"\[email protected]\b" 

Nếu không có này, chuỗi " \ b "được hiểu là một backspace (ký tự 8), không phải là một biểu thức từ thông dụng. Có thêm thông tin về @-quoted string literals trên MSDN.

Một cách khác mà không sử dụng @ xâu -quoted là để thoát khỏi những dấu xồ nguợc của bạn:

"\\[email protected]\\b" 
1

Các \ là nhận được thoát trong chuỗi của bạn - bạn cần phải sử dụng string literals để tránh điều này:

@"\bINSERT\b" 

Nếu không, regex sẽ thấy "bINSERTb".

+0

Chỉ có vấn đề này, mọi thứ đều hoạt động trong các trình kiểm tra RegEx bên ngoài khác nhau của tôi; chỉ không có trong mã của tôi - tôi đã quên @. – ProVega

4

Trường hợp thứ hai được giải quyết bằng @"\bINSERT\b" như được nêu trong câu trả lời khác.

Tuy nhiên /b trận đấu tại địa chỉ:

  • Trước khi ký tự đầu tiên trong chuỗi , nếu ký tự đầu tiên là một nhân vật từ.
  • Sau ký tự cuối cùng trong chuỗi , nếu ký tự cuối cùng là ký tự từ .
  • Giữa hai ký tự trong chuỗi, trong đó một ký tự là từ và khác không phải là một ký tự từ.

Một nhân vật từ là một trong những [a-zA-Z0-9_] nên trường hợp đầu tiên là không thể giải quyết được bằng cách đặt trước @ để thoát khỏi nhân vật \b bởi vì bạn đang cố gắng để sau đó kết hợp một nhân vật từ phi (@).


Cập nhật: Các trường hợp đầu tiên có thể được giải quyết bằng một âm nhìn đằng sau sự khẳng định mà còn bằng cách sử dụng một từ phủ nhận ranh giới \B mà kết quả trong một cú pháp sạch hơn (@"\[email protected]\b").

+0

Ồ, cảm ơn vì đã chỉ ra điều đó;) Có cách nào để vượt qua nó không? –

+0

@Thomas Wanner, bạn có thể sử dụng Regular Expressions Lookbehind Zero-Width Assertions. Kiểm tra Mark Byers trả lời cho một giải pháp. –

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