RegEx-golf: khớp tất cả các nội dung trong một chuỗi


10

Nhiệm vụ của bạn là viết một RegEx khớp với mọi thứ bên trong chuỗi.

Một chuỗi được định nghĩa là mọi thứ được bao quanh bởi (nhưng không bao gồm) hai không thoát ".

A "có thể thoát được \, cũng có thể thoát được lần nữa.

Tủ thử

string:  ab\c"defg\\\"hi"jkl"mn\\\\"opqrst""
matches:      ^^^^^^^^^^     ^^^^^^        ^ (the empty string)

Chấm điểm

Giải pháp ngắn nhất chiến thắng.

Thông số kỹ thuật

  • Vui lòng ghi rõ hương vị được sử dụng.
  • Đầu vào sẽ có sự cân bằng ".
  • Sẽ không có \ngay trước một dấu phân cách bắt đầu chuỗi. Ví dụ, bạn sẽ không cần phải xử lýabc\"def"

1
Sẽ có \trước một chuỗi? Ví dụ abc\"def".
jimmy23013

Nó có nên khớp với từng chuỗi trong một nhóm không? Ví dụ: tôi có thể viết một cái gì đó có hai trận đấu abc"de", một là dvà một là ekhông?
jimmy23013

Điều đó được cho phép .
Nữ tu bị rò rỉ

Sẽ có chuỗi trống?
Martin Ender

Vâng, sẽ có chuỗi trống.
Nữ tu bị rò rỉ

Câu trả lời:


3

PCRE, 21 20 15 19 byte

(.|^)"\K(\\.|[^"])*

Hãy thử nó ở đây.

Điều này khớp với một ký tự (hoặc bắt đầu của đầu vào) trước khi trích dẫn kép bắt đầu và sau đó đặt lại trận đấu, để đảm bảo rằng trích dẫn kép không được chia sẻ với trận đấu khác.

PCRE, 25 23 byte

Cảm ơn Martin Büttner vì đã chơi golf 2 byte.

(\\.|[^"])*+(?!"(?R)|$)

Hãy thử nó ở đây.

Giải trình

(
    \\.|[^"]     # An escaped character, or a character that isn't a double quote
)*+              # Possessive zero-or-more quantifier, which means backtracking
                 # could not happen after first match is found. That means if \\.
                 # matched, it would never switch to [^"], because it is always a
                 # match if it just stopped after the \\. without backtracking.
(?!"(?R)|$)      # Make sure it is not followed by a double quote and another
                 # match, or the end of the input.

Lưu ý rằng bộ định lượng sở hữu ( *+) đảm bảo giao diện phủ định luôn bắt đầu sau toàn bộ chuỗi hoặc toàn bộ phân đoạn không chuỗi.

Có 4 trường hợp:

  • Trận đấu bắt đầu ở bất cứ đâu ngoài chuỗi. \\.sẽ không bao giờ khớp với một trích dẫn đôi theo sự làm rõ. Nó chỉ có thể kết thúc ngay trước trích dẫn kép tiếp theo bắt đầu một chuỗi hoặc kết thúc đầu vào. Cả hai trường hợp đều thất bại trong cái nhìn tiêu cực.
  • Trận đấu bắt đầu ở đầu một chuỗi. (\\.|[^"])*+sẽ phù hợp với một chuỗi hoàn chỉnh. Ký tự tiếp theo phải là một trích dẫn kép và không thể là kết thúc của đầu vào. Sau trích dẫn kép, nó nằm ngoài chuỗi, vì vậy nó không thể là một kết hợp khác. Vì vậy, nó vượt qua cái nhìn tiêu cực.
  • Trận đấu bắt đầu ở cuối chuỗi. Nó khớp với một chuỗi rỗng theo cách tương tự như trường hợp trước. Nhưng nó không quan trọng theo sự làm rõ.
  • Trận đấu bắt đầu ở giữa một chuỗi. Không thể vì các trận đấu không trùng nhau.

Sẽ (\\.|[^"])làm việc?
Martin Ender

@ MartinBüttner phù hợp với tất cả mọi thứ trừ "
Bálint

@ Bálint Ý tôi là thay thế ([^\\"]|\\.), không phải là giải pháp hoàn chỉnh.
Martin Ender

@ MartinBüttner Ồ, ok
Bálint

Đề xuất của Martin nên hoạt động, vì \\.chỉ thất bại khi không có ký tự sau \(hoặc ký tự dòng mới, nhưng có thể được sửa bằng cờ) và trường hợp đó được bao phủ bởi cái nhìn tiêu cực phía sau. Bộ định lượng sở hữu ngăn chặn quay lui, vì vậy chúng tôi không có trường hợp nào khác để xem xét.
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

0

JavaScript, 24 byte

"([^"\\]*(?:\\.[^"\\]*)*)"

Nhóm 1 là nội dung của chuỗi.


Điều này hoàn toàn không hoạt động với các trích dẫn đã thoát, và do đó không đáp ứng được thông số kỹ thuật.
ATaco

À đúng rồi - xin lỗi. Thế còn cái đó?
Whothehellisthat

Đóng nhưng không có xì gà, bạn không nên kết hợp với "s bên ngoài
ATaco

Vâng, đó là những gì tôi sợ. Không có cách nào để làm điều đó trong JavaScript, tôi đoán?
Whothehellisthat

Bạn có thể chụp nó trong một nhóm nhỏ
ATaco

0

JavaScript, 21 15 13 12 byte

"((\\?.)*?)"

Nội dung chuỗi nằm trong nhóm 1.

"   #start of string
(    #capturing group
 (
  \\?. #match character or escaped character
 )*?  #match as few as possible
)        
"   #end of string
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.