Tôi đang làm việc trên thư viện JavaScript của riêng mình để hỗ trợ các siêu ký tự và tính năng mới cho cụm từ thông dụng và tôi muốn tìm trường hợp [^xy]
không tương đương với (?!x).
(hoặc cụ thể hơn (?:(?!x|y).)
).Có trường hợp "[^ xy]" không bằng "(?! X | y)."?
Lấy văn bản Ví dụ: "abc\n"
Nói rằng tôi muốn mô phỏng một regex Perl: /\A.{3}\Z/s
Với cờ singleline, regex JavaScript nên tương đương với: /^[\s\S]{3}\n*$(?!\s)/
(\A
trở thành ^
, .
trở thành [\s\S]
, \Z
trở thành \n*$(?!\s)
)
Bây giờ, /^.{3}$/
sẽ không thành công, nhưng /^[\s\S]{3}\n*$(?!\s)/
sẽ c apture "abcabc" (giống như regex Perl)
Vì số \Z
có chứa nhiều hơn một metacharacter, mô phỏng [^\Z]
có vẻ khó khăn hơn.
Lấy văn bản Ví dụ: "abcabc\n"
đề xuất regex JavaScript cho regex Perl /.{3}[^\Za]/g
sẽ .{3}(?:(?!\n*$(?!\s)|a).)/g
Cả hai sẽ phù hợp "bcab"
Vì vậy, cuối cùng, tôi đưa ra câu hỏi một lần nữa. Có một trường hợp mà [^xy]
không tương đương với (?:(?!x|y).)
với một kịch bản như vậy, có lẽ trong một biểu thức chính quy phức tạp hơn, nơi một lookahead sẽ thay đổi kịch bản?
'/^[\ s \ S] {3} \ n * $ (?! \ S) /. Exec (" abcabc \ n ")' không khớp với tôi và không cung cấp 'abcabc' như bạn đề xuất – Eric
Cũng không phải regex perl '/ \ A. {3} \ Z/s' khớp '' abcabc \ n "', như bạn đã xác nhận ... – Eric
Đúng. Tôi đã thay đổi một số thứ xung quanh và quên chỉnh sửa chúng. Kịch bản đầu tiên sử dụng văn bản "abc \ n" và kịch bản thứ hai sử dụng văn bản "abcabc \ n". Tôi đã chỉnh sửa bài đăng chính. –