2010-01-22 13 views
47

Đối với PMD, tôi muốn có quy tắc cảnh báo cho tôi về những biến xấu xí bắt đầu bằng biến của tôi. Điều này có nghĩa là tôi phải chấp nhận tất cả các biến KHÔNG bắt đầu bằng của tôi.Chuỗi đối sánh RegExp không bắt đầu bằng số

Vì vậy, tôi cần một RegEx (tái) mà ứng xử như sau:

re.match('myVar')  == false 
re.match('manager')  == true 
re.match('thisIsMyVar') == true 
re.match('myOtherVar') == false 
re.match('stuff')  == true 

Tôi đã thử cái khác nhau (sẽ liệt kê chúng ở đây sau đó, xin lỗi, không có quyền truy cập vào chúng ngay bây giờ) nhưng thiên đường' Tôi đã làm việc đó chưa.

+1

Tôi nghĩ rằng thực sự nên là một cái nhìn tiêu cực phía sau (không phải là một cái nhìn tiêu cực phía trước). – Indrit

Trả lời

31

Bạn có thể sử dụng xác nhận tra cứu như những người khác đã đề xuất. Hoặc, nếu bạn chỉ muốn sử dụng cú pháp biểu thức chính quy cơ bản:

^(.?$|[^m].+|m[^y].*) 

này phù hợp với chuỗi là một trong hai dài (^.?$) và do đó không thể my không hoặc một ký tự. Hoặc các chuỗi có hai hoặc nhiều ký tự trong đó khi ký tự đầu tiên không phải là m, bất kỳ ký tự nào khác có thể theo sau (^[^m].+); hoặc nếu ký tự đầu tiên là m thì không được theo sau bởi y (^m[^y]).

+0

Đây là cái mà chúng tôi có thể sử dụng ngay bây giờ. Có vẻ như có một vấn đề với regexp mở rộng, nhưng điều này hoạt động tốt cho bây giờ. –

103
^(?!my)\w+$ 

sẽ hoạt động.

Trước tiên, đảm bảo rằng không thể khớp với my ở đầu chuỗi và sau đó đối sánh các ký tự chữ và số cho đến cuối chuỗi. Khoảng trắng ở bất kỳ đâu trong chuỗi sẽ khiến cho regex thất bại. Tùy thuộc vào đầu vào của bạn, bạn có thể muốn dải trắng khoảng trống ở phía trước và sau của chuỗi trước khi chuyển nó vào regex hoặc sử dụng thêm các đối sánh khoảng trắng tùy chọn vào regex như ^\s*(?!my)(\w+)\s*$. Trong trường hợp này, backreference 1 sẽ chứa tên của biến.

Và nếu bạn cần để đảm bảo rằng tên biến của bạn bắt đầu với một nhóm nào đó của nhân vật, nói [A-Za-z_], sử dụng

^(?!my)[A-Za-z_]\w*$ 

Lưu ý sự thay đổi +-*.

34
/^(?!my).*/ 

(?!expression) là dấu hiệu tiêu cực; nó khớp với vị trí mà tại đó expressionkhông phù hợp với bắt đầu từ vị trí đó.

5

Sẽ không dễ đọc hơn khi thực hiện kết quả trùng khớp và từ chối các chuỗi đó - thay vì khớp với số âm để tìm chuỗi chấp nhận?

/^my/ 
+2

Điều đó sẽ dễ dàng hơn NHƯNG nó (là) cần thiết cho một quy tắc kiểm tra mã khi cam kết vào một kho lưu trữ, do đó logic không thể được "hoàn nguyên". –