Toán tử biểu thức chính quy nào có nghĩa là 'Không' khớp với ký tự này?


90

*, ?, +tất cả các ký tự có nghĩa là phù hợp với ký tự này. Ký tự nào có nghĩa là 'không' phù hợp với điều này? Ví dụ sẽ hữu ích.


Để biết giải pháp liên quan đến việc không khớp với một từ - Xem tại đây stackoverflow.com/questions/406230
null

Câu trả lời:


89

Bạn có thể sử dụng các lớp ký tự bị phủ định để loại trừ các ký tự nhất định: ví dụ: [^abcde]sẽ khớp với bất kỳ thứ gì ngoại trừ các ký tự a, b, c, d, e.

Thay vì chỉ định tất cả các ký tự theo nghĩa đen, bạn có thể sử dụng các viết tắt bên trong các lớp ký tự: [\w](chữ thường) sẽ khớp với bất kỳ "ký tự từ" nào (chữ cái, số và dấu gạch dưới), [\W](chữ hoa) sẽ khớp với bất kỳ ký tự nào ngoài từ; tương tự, [\d]sẽ khớp với các chữ số 0-9 trong khi [\D]khớp với bất kỳ thứ gì ngoại trừ các chữ số 0-9, v.v.

Nếu bạn sử dụng PHP, bạn có thể xem qua tài liệu về các lớp ký tự regex .


81

Có hai cách để nói "không khớp": phạm vi ký tự và lookahead / lookbehind phủ định chiều rộng bằng không.

Các cựu: không phù hợp a, b, choặc 0:[^a-c0]

Cái sau: khớp với bất kỳ chuỗi ba ký tự nào ngoại trừ foobar:

(?!foo|bar).{3}

hoặc là

.{3}(?<!foo|bar)

Ngoài ra, một sự điều chỉnh cho bạn: *, ?+không thực sự phù hợp với bất cứ điều gì. Chúng là các toán tử lặp và luôn tuân theo một toán tử phù hợp. Như vậy, a+phương tiện phù hợp với một hoặc nhiều a, [a-c0]+phương tiện phù hợp với một hoặc nhiều a, b, choặc 0, trong khi [^a-c0]+sẽ phù hợp với một hoặc nhiều bất cứ điều gì đó không phải là a, b, choặc 0.


^((?!foo).)+$Khớp bất kỳ dòng nào không chứa foo regex101.com/r/z6a65l/4
Levi Baguley

48

[^] (trong [] ) là phủ định trong biểu thức chính quy trong khi ^là "đầu chuỗi"

[^a-z] khớp với bất kỳ ký tự đơn nào không phải từ "a" đến "z"

^[a-z] có nghĩa là chuỗi bắt đầu bằng từ "a" đến "z"

Tài liệu tham khảo


8

^ được sử dụng ở đầu dải ký tự hoặc xác nhận lookahead / lookbehind phủ định.

>>> re.match('[^f]', 'foo')
>>> re.match('[^f]', 'bar')
<_sre.SRE_Match object at 0x7f8b102ad6b0>
>>> re.match('(?!foo)...', 'foo')
>>> re.match('(?!foo)...', 'bar')
<_sre.SRE_Match object at 0x7f8b0fe70780>

Bạn có phải sử dụng ?!trong 2 ví dụ cuối cùng hay bạn có thể chỉ sử dụng một !mình? Làm gì ?ở đó?
Nhấp vào Ủng hộ

Python cần ?để nói rằng nó là một phần mở rộng. Các công cụ regex khác có thể có các quy tắc riêng của chúng.
Ignacio Vazquez-Abrams

@Click: Nó khá chuẩn. Regular-expressions.info/refadv.html , hầu hết các hướng dẫn sử dụng công cụ regexp cũng nói điều tương tự.
Amadan
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.