2009-07-30 34 views
41

Trong C#, tôi muốn sử dụng một biểu thức chính quy để phù hợp với bất kỳ của những lời này:Regex.Match toàn bộ từ

string keywords = "(shoes|shirt|pants)"; 

Tôi muốn tìm ra toàn bộ từ trong chuỗi nội dung. Tôi nghĩ regex này sẽ làm điều đó:

if (Regex.Match(content, keywords + "\\s+", 
    RegexOptions.Singleline | RegexOptions.IgnoreCase).Success) 
{ 
    //matched 
} 

nhưng nó sẽ trả về đúng đối với những từ như participants, mặc dù tôi chỉ muốn toàn bộ từ pants.

Làm cách nào để chỉ khớp các từ ngữ đó?

Trả lời

72

Bạn nên thêm dấu phân cách từ để regex của bạn:

\b(shoes|shirt|pants)\b 

Trong mã:

Regex.Match(content, @"\b(shoes|shirt|pants)\b"); 
1

đặt một ranh giới từ vào nó bằng cách sử dụng metasequence \ b.

+3

Điều này cung cấp câu trả lời, mặc dù không phải là biểu thức chính quy. – escist

4

Bạn cần một sự khẳng định zero-chiều rộng ở hai bên rằng các nhân vật trước hoặc sau chữ không phải là một phần của từ:

(?=(\W|^))(shoes|shirt|pants)(?!(\W|$)) 

Như những người khác đề nghị, tôi nghĩ\ b sẽ làm việc thay vì (? = (\ W | ^))(?! (\ W | $)) ngay cả khi từ ở đầu hoặc cuối của chuỗi đầu vào, nhưng tôi không chắc chắn.

+0

Mẫu của bạn tốt hơn so với "\ b", bởi vì mẫu sau sẽ không lấy các từ khóa, ví dụ: kết thúc bằng dấu phẩy ("từ khóa"), trong khi nó được mong đợi. Ngoài ra, mẫu chính xác là: (? <= \ W | ^) (từ khóa) (? = \ W | $) –

13

Hãy thử

Regex.Match(content, @"\b" + keywords + @"\b", RegexOptions.Singleline | RegexOptions.IgnoreCase) 

\b trận đấu trên ranh giới từ. Xem here để biết thêm chi tiết.

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