Biểu thức chính quy Ruby có toán tử không khớp như “! ~” Trong Perl không?


92

Tôi chỉ muốn biết liệu ruby ​​regex có toán tử không khớp giống như !~trong perl hay không. Tôi cảm thấy thật bất tiện khi sử dụng (?!xxx)hoặc (?<!xxxx)vì bạn không thể sử dụng các mẫu regex trong xxxphần này.


8
Tất cả những gì bạn phải làm là khởi động irbvà thử nó. Có lẽ sẽ nhanh hơn đăng một câu hỏi SO.
Mark Thomas

33
Nhưng không phải nhanh hơn googling 'ruby không phù hợp' và tìm kiếm câu trả lời này trên SO;)
micapam

3
Tôi đã thử nghiệm một lúc trước khi gặp khó khăn, googling và tìm ra câu trả lời này (cách này đã hiệu quả.). Đừng bao giờ đổ lỗi cho ai đó vì đã đặt một câu hỏi.
Jonathon Nordquist

2
Anh ấy đã diễn đạt nó một cách kém tối ưu. Những gì tôi nghĩ anh ấy muốn nói là, "hãy nhớ bạn có thể bắt đầu irbvà thử nó. Có thể nhanh hơn, thậm chí, hơn đăng một câu hỏi SO và là cơ hội tuyệt vời để kiểm tra mọi thứ nói chung." Đó là cách tôi nghe nó, dù sao.
user2066657

Câu trả lời:


156

Có: !~hoạt động tốt - bạn có thể nghĩ rằng nó sẽ không vì nó bị thiếu trong trang tài liệu củaRegexp . Tuy nhiên, nó hoạt động:

irb(main):001:0> 'x' !~ /x/
=> false
irb(main):002:0> 'x' !~ /y/
=> true

8
!~được ghi lại trong Đối tượng .
Tonči D.

3
Với ruby ​​2.4, cũng có cú pháp đẹp hơn một chút RegExp#match?, mà bạn có thể dễ dàng phủ nhận. Theo ghi chú phát hành , nó thậm chí còn ít phân bổ hơn!~
panmari

6

AFAIK (?! Xxx) được hỗ trợ:

2.1.5 :021 > 'abc1234' =~ /^abc/
 => 0
2.1.5 :022 > 'def1234' =~ /^abc/
 => nil
2.1.5 :023 > 'abc1234' =~ /^(?!abc)/
 => nil
2.1.5 :024 > 'def1234' =~ /^(?!abc)/
 => 0

Đó là một giải pháp cấp thấp hơn. Không phải lúc nào cũng dễ dàng chuyển đổi regexps theo cách này. Mặt khác, giải pháp này không phụ thuộc vào ngôn ngữ lập trình cấp cao nhất;)
Konstantin

0

Quay lại perl, 'foobar' !~ /bar/đã hoàn toàn hợp lệ để kiểm tra rằng chuỗi không chứa "bar".

Trong Ruby, đặc biệt là với hướng dẫn kiểu hiện đại, tôi nghĩ rằng một giải pháp rõ ràng hơn là thông thường và dễ hiểu hơn:

input = 'foobar'

do_something unless input.match?(/bar/) 

needs_bar = !input.match?(/bar/)

Điều đó nói rằng, tôi nghĩ rằng nó sẽ rất thú vị nếu có một .no_match?phương pháp.

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.