2015-02-15 12 views
5

Tôi khá chắc chắn tôi đã thấy \R được giới thiệu vào Ruby2 để phù hợp với dòng mới, mặc dù nơi họ đến từ: unix \n, macos \r hay cửa sổ \r\n đâu đó . Điều đó nói rằng, Ruby2 nên xử lý \R như %r{\r\n|\r|\n}.của Ruby regex 'xuyệc ngược R' aka ' R' mẫu

này hoạt động tốt:

▶ "a\nb".match /\R/ 
#⇒ #<MatchData "\n"> 
▶ "a\rb".match /\R/ 
#⇒ #<MatchData "\r"> 
▶ "a\r\nb".match /\R/ 
#⇒ #<MatchData "\r\n"> 

thậm chí cho dù kết thúc dòng/thức ăn được kết hợp:

▶ "a\r\n\nb".match /\R{2}/ 
#⇒ #<MatchData "\r\n\n"> 

trừ khi một cố gắng phủ nhận \R:

▶ "a\nb".match /[^\R]+/ 
#⇒ #<MatchData "a\nb"> 

Làm giảm \n hoạt động tốt mặc dù :

▶ "a\nb".match /[^\n]+/ 
#⇒ #<MatchData "a"> 

Thật không may, \R cực kỳ khó khăn đối với google. Không phải Regexp rdoc cũng không phải Regular Expressions có đề cập đến nó.

Liệu có bất kỳ chuyên gia regex nào có giải thích ở đây, để ít nhất nó dễ dàng được googled?

Xin cảm ơn trước.

+1

Sau khi đọc lời giải thích của @ sawa, điều này có vẻ hoàn toàn hợp lý, tôi tự hỏi nếu điều này có thể là một lỗi. Dường như với tôi rằng ''a \ nb' .match/[^ \ R] + /' sẽ hoạt động theo cách bạn mong đợi. Tôi đã bỏ email đến [K. Takata] (https://github.com/k-takata) yêu cầu anh/cô ấy xem xét câu hỏi của bạn. –

+0

@CarySwoveland Cảm ơn vì điều đó. Mặt khác, tôi không nghĩ rằng sự tách rời các biểu thức nguyên tử có thể [dễ dàng] phủ nhận. Chúng tôi chỉ đơn giản không nên mong đợi hành vi chính xác bên trong dấu ngoặc vuông từ không phải chữ, chính xác như chúng tôi không mong đợi các tham chiếu ngược (có vẻ gần như cùng một ký hiệu) để hoạt động đúng trong nhóm ký tự. – mudasobwa

Trả lời

4

Đây là từ tác giả: https://github.com/k-takata/Onigmo/blob/master/doc/RE#L101. Nó nói

\R  Linebreak 

     Unicode: 
      (?>\x0D\x0A|[\x0A-\x0D\x{85}\x{2028}\x{2029}]) 

     Not Unicode: 
      (?>\x0D\x0A|[\x0A-\x0D]) 

Điều gì dường như có liên quan ở đây với câu hỏi của bạn là nó không phải là nhóm ký tự, nhưng là danh sách các lựa chọn thay thế. Cho rằng trình tự không nhất thiết phải là một ký tự đơn, tôi đoán nó không thể được thực hiện thành một nhóm nhân vật. Điều này có thể tương tác theo cách đặc biệt với sự phủ định, được dự định chỉ được sử dụng với các ký tự và/hoặc các nhóm ký tự.

+0

Cảm ơn bạn, tham chiếu này chính xác là những gì tôi đã bỏ lỡ. Bạn có nhớ cập nhật tham chiếu của mình để bao gồm đường neo không: https://github.com/k-takata/Onigmo/blob/master/doc/RE#L101 – mudasobwa

+0

@mudasobwa: Xong. – Stephan202

Các vấn đề liên quan