2011-11-18 36 views
17

Tôi gặp một chút rắc rối với một phần của cụm từ thông dụng sẽ được sử dụng trong JavaScript. Tôi cần một cách để khớp với bất kỳ ký tự nào khác ngoài ký tự +, một chuỗi trống cũng phải khớp.Biểu thức chính quy - Đối sánh bất kỳ ký tự nào ngoại trừ +, chuỗi trống cũng phải khớp với

[^+] gần như là những gì tôi muốn ngoại trừ nó không khớp với một chuỗi rỗng. Tôi đã thử suy nghĩ [^+]*: "bất kỳ ký tự nào khác ngoài +, không hoặc nhiều lần", nhưng điều này khớp với mọi thứ bao gồm +.

+0

Làm thế nào là nó có thể rằng '[^ +] *' phù hợp với một '+ '? Điều đó không có ý nghĩa. Phải có điều gì khác sai với biểu hiện của bạn. –

+1

@ScottRippey: Tôi đoán (trong câu trả lời của tôi) rằng định lượng '*' đã cho phép kết hợp thành công bằng cách không khớp (không có ký tự nào không phải là '+') thành công. Không có neo hoặc các xác nhận khác, nó về mặt lý thuyết có thể khớp trước hoặc sau '+', do đó cho phép toàn bộ chuỗi khớp với nhau. (Tất nhiên nó sẽ phù hợp với trước bởi vì đó là lần đầu tiên, và nó sẽ dừng lại ở đó) không đánh giá này không có ý nghĩa với bạn? –

Trả lời

18

Add a {0,1} với nó để nó sẽ chỉ phù hợp với không hoặc một lần, không hơn không kém:

[^+]{0,1} 

Hoặc, như FailedDev chỉ ra, ? làm việc quá:

[^+]? 

Đúng như dự đoán, thử nghiệm với bảng điều khiển JavaScript của Chrome hiển thị không phù hợp cho "+" nhưng không phù hợp với các nhân vật khác:

x = "+" 
y = "A" 

x.match(/[^+]{0,1}/) 
[""] 

y.match(/[^+]{0,1}/) 
["A"] 

x.match(/[^+]?/) 
[""] 

y.match(/[^+]?/) 
["A"] 
+3

Không, bạn không cần phải thoát khỏi nó, thứ hai {0,1} =?. 1 Tuy nhiên. – FailedDev

+0

Cả hai tùy chọn có vẻ phù hợp với mọi thứ, bao gồm chỉ + theo http://www.regular-expressions.info/javascriptexample.html – zaq

+0

Theo trang web ở trên, tùy chọn đó không khớp với bất kỳ thứ gì. – zaq

4

Nếu bạn chỉ cần kiểm tra các chuỗi để xem nếu nó không chứa một +, sau đó bạn nên sử dụng:

^[^+]*$ 

này sẽ phù hợp chỉ khi chuỗi TOÀN BỘ không có +.

+0

Đây thực sự chỉ là một phần của biểu thức lớn hơn vì vậy tôi không nhất thiết muốn khớp toàn bộ chuỗi. – zaq

18
  • [^+] có nghĩa là "phù hợp với bất kỳ ký tự đơn đó không phải là một +"
  • [^+]* có nghĩa là "phù hợp với bất kỳ số lượng ký tự mà không phải là một +" - đó gần như có vẻ giống như những gì tôi nghĩ rằng bạn muốn, ngoại trừ việc nó sẽ phù hợp 0 ký tự nếu ký tự đầu tiên (hoặc thậm chí tất cả các ký tự) là +.

sử dụng neo để đảm bảo rằng biểu thức xác nhận STRING TOÀN BỘ:

^[^+]*$ 

có nghĩa là:

^  # assert at the beginning of the string 
[^+]* # any character that is not '+', zero or more times 
$  # assert at the end of the string 
Các vấn đề liên quan