Chuỗi đối sánh RegExp không bắt đầu bằng của tôi


90

Đối với PMD, tôi muốn có một quy tắc cảnh báo tôi về những biến số xấu bắt đầu bằng my.
Đ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 my.

Vì vậy, tôi cần một RegEx (lại) hoạt động 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ử những cái khác nhau nhưng vẫn chưa hoạt động.


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

Câu trả lời:


43

Bạn có thể sử dụng xác nhận trước mắt 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].*)

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


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

166
^(?!my)\w+$

nên làm việc.

Trước tiên, nó đảm bảo rằng không thể khớp myở đầu chuỗi, sau đó khớp 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 regex bị lỗi. Tùy thuộc vào đầu vào của bạn, bạn có thể muốn tách khoảng trắng ở phía trước và phía sau của chuỗi trước khi chuyển nó đến regex hoặc sử dụng thêm các trình so khớp 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 bằng một nhóm ký tự nhất định, hãy [A-Za-z_]sử dụng

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

Lưu ý sự thay đổi từ +thành *.


60
/^(?!my).*/

(?!expression)là một cái nhìn tiêu cực; nó khớp với một vị trí mà expression không khớp với bắt đầu từ vị trí đó.


7

Sẽ dễ đọc hơn đáng kể nếu thực hiện đối sánh tích cực và từ chối các chuỗi đó - thay vì so khớp tiêu cực để tìm các chuỗi chấp nhận?

/^my/

4
Điều đó sẽ dễ dàng hơn NHƯNG nó (đã) cần thiết cho một quy tắc kiểm tra mã khi cam kết với một kho lưu trữ, do đó không thể "hoàn nguyên" logic.
Dominik Sandjaja
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.