Làm cách nào để tôi viết regex để khớp với bất kỳ chuỗi nào không đáp ứng một mẫu cụ thể? Tôi đang phải đối mặt với một tình huống mà tôi phải khớp một mẫu (A và ~ B).
Làm cách nào để tôi viết regex để khớp với bất kỳ chuỗi nào không đáp ứng một mẫu cụ thể? Tôi đang phải đối mặt với một tình huống mà tôi phải khớp một mẫu (A và ~ B).
Câu trả lời:
Bạn có thể sử dụng một xác nhận nhìn về phía trước:
(?!999)\d{3}
Ví dụ này phù hợp với ba chữ số khác 999
.
Nhưng nếu bạn không thực hiện biểu thức chính quy với tính năng này (xem So sánh các hương vị biểu thức chính quy ), bạn có thể phải tự xây dựng một biểu thức chính quy với các tính năng cơ bản.
Một biểu thức chính quy tương thích chỉ với cú pháp cơ bản sẽ là:
[0-8]\d\d|\d[0-8]\d|\d\d[0-8]
Điều này cũng không phù hợp với bất kỳ chuỗi ba chữ số không 999
.
Nếu bạn muốn ghép một từ A trong một chuỗi và không khớp với một từ B. Ví dụ: Nếu bạn có một văn bản:
1. I have a two pets - dog and a cat
2. I have a pet - dog
Nếu bạn muốn tìm kiếm các dòng văn bản CÓ chó cho thú cưng và KHÔNG CÓ mèo, bạn có thể sử dụng biểu thức thông thường này:
^(?=.*?\bdog\b)((?!cat).)*$
Nó sẽ chỉ tìm thấy dòng thứ hai:
2. I have a pet - dog
findstr
lệnh DOS . Nó chỉ có một tập hợp nhỏ các khả năng mà bạn mong muốn tìm thấy trong một công cụ regex; lookahead không nằm trong số đó. (Tôi vừa tự thêm thẻ findstr .)
Khớp với mẫu và sử dụng ngôn ngữ máy chủ để đảo ngược kết quả boolean của trận đấu. Điều này sẽ dễ đọc và dễ bảo trì hơn nhiều.
Lưu ý, làm sống lại câu hỏi cổ xưa này bởi vì nó có một giải pháp đơn giản không được đề cập. (Tìm thấy câu hỏi của bạn trong khi thực hiện một số nghiên cứu cho nhiệm vụ tiền thưởng regex .)
Tôi đang phải đối mặt với một tình huống mà tôi phải khớp một mẫu (A và ~ B).
Regex cơ bản cho điều này là đơn giản đáng sợ: B|(A)
Bạn chỉ cần bỏ qua các trận đấu tổng thể và kiểm tra các ảnh chụp nhóm 1, sẽ chứa A.
Một ví dụ (với tất cả các từ chối trách nhiệm về phân tích cú pháp html trong regex): A là chữ số, B là chữ số trong <a tag
Các regex: <a.*?<\/a>|(\d+)
Bản trình diễn (nhìn vào Nhóm 1 ở khung bên phải phía dưới)
Tài liệu tham khảo
Làm thế nào để khớp mẫu ngoại trừ trong các tình huống s1, s2, s3
\d
bằng [[:digit:]]
. Tham chiếu đầu tiên đề cập đến nó dành riêng cho Perl và PHP: "Có một biến thể sử dụng cú pháp cụ thể cho Perl và PHP thực hiện giống nhau."
Phần bổ sung của ngôn ngữ thông thường cũng là ngôn ngữ thông thường, nhưng để xây dựng ngôn ngữ đó, bạn phải xây dựng DFA cho ngôn ngữ thông thường và làm cho bất kỳ thay đổi trạng thái hợp lệ nào thành lỗi. Xem điều này cho một ví dụ. Những gì trang không nói là nó được chuyển đổi /(ac|bd)/
thành /(a[^c]?|b[^d]?|[^ab])/
. Việc chuyển đổi từ DFA trở lại biểu thức chính quy không phải là chuyện nhỏ. Sẽ dễ dàng hơn nếu bạn có thể sử dụng biểu thức chính quy không thay đổi và thay đổi ngữ nghĩa trong mã, như được đề xuất trước đây.
replace
str.replace(/re/g, '')
, sau đó không cần phải tham gia lại với họ. Ngoài ra nếu bạn ném vào một dấu vết tốt đẹp? như str.replace(/\re\s?/g, '')
sau đó bạn thoát khỏi bất kỳ không gian trùng lặp nào bạn sẽ có từ một thứ được thay thế ở giữa một chuỗi
Câu trả lời của tôi ở đây cũng có thể giải quyết vấn đề của bạn:
https://stackoverflow.com/a/27967674/543814
$1
, bạn sẽ đọc nhóm $2
.$2
đã được thực hiện không bắt ở đó, mà bạn sẽ tránh.Thí dụ:
Regex.Match("50% of 50% is 25%", "(\d+\%)|(.+?)");
Nhóm chụp đầu tiên chỉ định mẫu mà bạn muốn tránh. Nhóm bắt cuối cùng nắm bắt mọi thứ khác. Đơn giản chỉ cần đọc ra nhóm đó , $2
.
findstr
thẻ vì tất cả các câu trả lời ở đây không hợp lệ cho thẻ.