2008-10-13 31 views
33

Câu hỏi dễ dàng lần này.RegEx để biết nếu một chuỗi không chứa một ký tự cụ thể

Tôi đang cố kiểm tra xem chuỗi có chứa ký tự không sử dụng cụm từ thông dụng hay không. Tôi nghĩ rằng biểu thức có dạng "[^ x]" trong đó x là ký tự mà bạn không muốn xuất hiện, nhưng điều đó dường như không hoạt động.

Ví dụ,

Regex.IsMatch("103","[^0]") 

Regex.IsMatch("103&","[^&]") 

cả trở thành sự thật (Tôi mong chờ false).

Tôi bắt đầu sử dụng "[^&]" và nghĩ rằng có thể & cần phải được thoát là \ &, nhưng dường như không có sự khác biệt.

Ý tưởng? Tôi cho rằng đó là một cái gì đó nhỏ.

Ngoài ra, tôi đang sử dụng .NET, vì vậy hãy ghi nhớ điều đó.

Edit1:

tôi thấy this, nhưng nó dường như không trả lời những vấn đề tôi gặp phải.

Edit2:

tôi muốn để đáp ứng Kevin và gợi ý Joel 's. Những đề xuất này thực sự sẽ nhanh hơn, nhưng chúng không hoàn thành tính linh hoạt mà tôi cần trong trường hợp này, vì vậy nếu bạn tìm thấy câu hỏi này thông qua tìm kiếm, hãy xem xem câu trả lời của họ có phù hợp với nhu cầu của bạn hay không. Trong trường hợp của tôi, biểu thức chính quy sẽ được chuyển vào một phương thức xác thực DataTable lặp qua mỗi hàng và xác minh rằng nội dung của hàng đó trong một cột cụ thể khớp với RegEx đang được chuyển vào. Vì tôi sẽ sử dụng lại phương thức này trong vài DataTables khác đang được xác nhận, tôi muốn:

  1. sử dụng Regex để cho phép phạm vi rộng nhất của kiểm chứng thực, và
  2. Luôn tìm kiếm một trận đấu tích cực (tức là thay vì sử dụng Regex.IsMatch (tế bào! , regexvariable), tôi muốn dựa vào luôn luôn có thể sử dụng Regex.IsMatch (ô, regexvariable) vì phần lớn DataTables gọi phương thức này sẽ sử dụng kết quả trùng khớp thay vì tiêu cực.

Hy vọng điều đó sẽ hữu ích.

+0

Nếu bạn chỉ kiểm tra sự hiện diện của một ký tự đơn, bạn có thể nhận được tốt hơn nhiều mà không cần regexes. Kevin là đúng: sử dụng .IndexOf() hoặc một cái gì đó đơn giản hơn. Nó sẽ dễ đọc hơn, rõ ràng hơn và nhanh hơn. – ruquay

Trả lời

51

Giải pháp của bạn là một nửa bên phải. Trận đấu bạn thấy là cho các nhân vật khác. Những gì bạn muốn nói là một cái gì đó như "hey! Tôi không muốn nhìn thấy nhân vật này trong toàn bộ chuỗi".

Trong trường hợp đó bạn cần làm:

Regex.IsMatch("103","^[^0]*$") 
+0

Cảm ơn! Tôi cũng đã thử "^ [^ 0] $", nhưng đã từ bỏ^và $ vì nó đã khiến mọi thứ được đánh giá là sai - chỉ cần dấu hoa thị đó. Cảm ơn một lần nữa - "hai vấn đề" của tôi hiện đã trở lại bằng không. – jerhinesmith

+4

Tôi đoán vậy! Regex.IsMatch ("103", "0") sẽ nhanh hơn. – Kip

+0

Tôi đang sử dụng điều này, tôi không muốn thấy các ký tự '?', '[', Và ']', tôi đã thử '^ [^?] * $', Mà đã làm việc cho '?' Dựa trên Ví dụ, nhưng khi tôi thêm các ký tự dấu ngoặc nó không hoạt động ... '^ [^? []] * $' – raffian

4

Ký tự đầu tiên phân tích cú pháp đạt là "1", đó là đúng đối với [^ 0] và cũng đúng đối với [^ &], vì thế nó sẽ trở lại đúng trong cả hai ví dụ đó.

7

nếu bạn đang tìm kiếm một ký tự đơn lẻ trong một chuỗi, regex có vẻ hơi quá mức. Tại sao không chỉ sử dụng .IndexOf hoặc .Contains?

+0

Điều này có hiệu quả, nhưng tôi đang cố viết một trình xác nhận hợp lệ DataTable bằng cách sử dụng các trình trang trí và tôi muốn một phương thức cho phép tôi mở rộng đến các kết quả chuỗi khác (có thể bao gồm hoặc độc quyền). – jerhinesmith

2

Bạn đang đặt từ chối của mình ở địa điểm sai. [^x] sẽ khớp với bất kỳ thứ gì không phải là x. Nếu x nằm trong chuỗi, chuỗi vẫn khớp với biểu thức nếu có bất kỳ ký tự nào khác. Thay vào đó, bạn muốn kết hợp đúng nếu x là ở đó, và sau đó phủ nhận kết quả của hàm:

Not Regex.IsMatch("103", "0") 

Not Regex.IsMatch("103&", "&") 

Không phải là với những ví dụ đơn giản, bình thường String.IndexOf() hoặc String.Contains() sẽ là một lựa chọn tốt hơn.

16

Mẫu [^ 0] sẽ khớp với bất kỳ ký tự nào không bằng 0. Trong cả hai ví dụ của bạn, mẫu sẽ khớp với ký tự đầu tiên ("1"). Để kiểm tra xem toàn bộ chuỗi có chứa số không, mẫu phải là "^ [^ 0] * $". Điều này đọc như sau: Bắt đầu ở đầu chuỗi, khớp với số ký tự tùy ý không phải là số không, theo sau ngay lập tức bằng cuối chuỗi. Bất kỳ chuỗi nào chứa số không sẽ thất bại. Bất kỳ chuỗi nào có chứa số không sẽ vượt qua.

+1

Giải thích tuyệt vời! – Mez

2

Tôi đã xem qua câu hỏi này tìm kiếm điều tương tự nhưng đối với JavaScript. Biểu thức ở trên không có tác dụng trong trường hợp của tôi, nhưng tôi đã đi qua biểu thức dưới đây. (Chỉ trong trường hợp bất kỳ ai khác tìm kiếm giải pháp JavaScript cũng kết thúc ở đây.)

^((?! 0).) * $

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