Kết hợp chéo biểu thức chính quy


21

Nhiệm vụ của bạn ở đây là viết hai biểu thức chính quy, mỗi biểu thức khớp với biểu thức kia nhưng không khớp với chính nó.

Cả hai biểu thức chính quy nên có dạng này:

/pattern/optional-flags

Đây cũng là hình thức mà chúng nên được kết hợp.

Giải pháp ngắn nhất sẽ thắng. Độ dài giải pháp được tính là tổng của các ký tự trong cả hai biểu thức chính quy bao gồm dấu gạch chéo và cờ.

Sử dụng tiêu chuẩn cú pháp regex theo lựa chọn của bạn hoặc chỉ định ngôn ngữ lập trình khi nó tạo ra sự khác biệt.

Chúc vui vẻ!


Liệu regex cũng phải phù hợp với dấu gạch chéo và cờ của regex khác?
Chương trìnhFOX

@ProgramFOX có, tôi đã thêm một dòng để làm cho nó rõ ràng.
GOTO 0

Bạn có thể định nghĩa phù hợp? tức là regex có /a/khớp abckhông?
The Guy with The Hat

2
@TheGuywithThe tốt, tôi nghĩ vậy, trừ khi bạn chọn một ngôn ngữ áp đặt một số hạn chế nhất định, như nhu cầu khớp với toàn bộ chuỗi. Điều này có giải quyết mối quan tâm của bạn?
GOTO 0

1
Để rõ ràng: Tôi cho rằng việc sử dụng các dấu phân cách khác nhau (như được cho phép bởi ví dụ PHP PCRE) là không được phép? (Tức là không gửi /^%/%^/%)
Peter Taylor

Câu trả lời:


7

PRCE với công cụ sửa đổi A: 9 ký tự

/A$/
/.A/A

Mặc dù đây là một biến thể trong /modifier$/câu trả lời của Doorknob , tôi nghĩ rằng sự đổi mới này đủ điều kiện là một câu trả lời riêng thay vì nhận xét về mình: người sửa đổi thực hiện nhiệm vụ kép. Thay vì ở đó chỉ để các regex khác khớp, nó neo lại.

Regex đầu tiên phù hợp với bất kỳ chuỗi kết thúc bằng chữ A. Regex thứ hai khớp với bất kỳ chuỗi nào có ký tự thứ hai là một chữ A, sử dụng cờ neo để bắt đầu.

Bản demo trực tuyến


3
Để đánh bại điều này chỉ cần bốn ký tự không phân cách và vì //khớp với bất kỳ thứ gì có nghĩa là mỗi ký hiệu có thể có tối đa ba ký tự không phân cách. Sử dụng PHP PCRE, có 73339 regex không tự khớp trong giới hạn đó và kiểm tra toàn diện các cặp có độ dài nhỏ hơn 10 (theo thứ tự 32Mpairs thay vì 5.7Gpairs vì hầu hết chúng là 5 ký tự bao gồm cả dấu phân cách) giải pháp này và không có ai khác. Do đó, tôi khẳng định rằng nó là tối ưu cho công cụ regex cụ thể đó.
Peter Taylor

18

4 + 6 = điểm 10

Regex đầu tiên:

/i$/

Regex thứ hai:

/^.i/i

Hoan hô lạm dụng cờ! :-P

Cái đầu tiên khớp với bất cứ thứ gì kết thúc bằng i(do đó, bất kỳ biểu thức chính quy nào với icờ).

Cái thứ hai khớp với bất cứ thứ gì có ký tự thứ hai i.

Phiên bản thay thế: /i$/g/g$/i.


3
Một biến thể khác sẽ là /x.$//^.x/cho một bó x
shiona

Hoặc /i$//\/$/i
Peter Taylor

Hoặc /i$//i\$/i
Peter Taylor

6

Regexes JavaScript, điểm: 18

Regex đầu tiên:

/^[^a]+$/

Regex thứ hai:

/^[^b]+$/

Kiểm tra JavaScript:

var regex1 = "/^[^a]+$/";
var regex2 = "/^[^b]+$/";
alert(/^[^a]+$/.test(regex2)); // true: regex1 matches regex2
alert(/^[^b]+$/.test(regex1)); // true: regex2 matches regex1
alert(/^[^a]+$/.test(regex1)); // false: regex1 doesn't match regex1
alert(/^[^b]+$/.test(regex2)); // false: regex2 doesn't match regex2

Kiểm tra trực tuyến: http://jsfiddle.net/99Sx6/


5

Ruby regex, 15

Biểu thức chính quy:

/.{9}/
/^.{06}$/

Chỉ cần đếm các ký tự ...

Phiên bản trực tuyến

r1 = '/.{9}/'
r2 = '/^.{06}$/'

p r1 =~ /^.{06}$/ #0:   r2 matches r1
p r2 =~ /.{9}/    #0:   r1 matches r2
p r1 =~ /.{9}/    #nil: r1 doesn't match r1
p r2 =~ /^.{06}$/ #nil: r2 doesn't match r2

5

4 + 6 = 10

Regex đầu tiên:

/i$/

Regex thứ hai:

/\/$/i

i$phù hợp với một cái gì đó kết thúc với i, thứ hai. /$phù hợp với một cái gì đó kết thúc với /, cái đầu tiên.


2
Dupe của một bình luận tôi đã đăng lên câu trả lời của Doorknob.
Peter Taylor

@PeterTaylor Không nhận thấy các bình luận cho đến bây giờ. Đây là những khám phá độc lập.
Justin

Vâng, tôi độc lập phát hiện ra phiên bản của shiona.
Peter Taylor

3

5 + 5 = 10

Regex # 1:

/0.$/

Regex # 2:

/^.0/

Các 0s trong cả hai regex có thể được thay thế bằng bất kỳ vi khuẩn không metacharacter nào và regex vẫn hoạt động.

0.$phù hợp với bất cứ ai có nhân vật cuối cùng thứ hai 0^.0phù hợp với bất cứ ai có nhân vật thứ hai 0.


2
Cặp đầu tiên không có regex hợp lệ: bạn cần thoát /es. Thay thế là một bản nhận xét về câu trả lời của Doorknob.
Peter Taylor

2

Regexes JavaScript, điểm: 13

Regex đầu tiên:

/\d/

Regex thứ hai:

/^[^0]+$/

Giải thích: regex đầu tiên khớp với mọi thứ có chứa một chữ số và regex thứ hai khớp với mọi thứ không chứa a 0.

Kiểm tra JavaScript:

var regex1 = "/\d/";
var regex2 = "/^[^0]+$/";
alert(/\d/.test(regex2)); // true: regex1 matches regex2
alert(/^[^0]+$/.test(regex1)); // true: regex2 matches regex1
alert(/\d/.test(regex1)); // false: regex1 doesn't match regex1
alert(/^[^0]+$/.test(regex2)); // false: regex2 doesn't math regex2

Kiểm tra trực tuyến: http://jsfiddle.net/5VYjC/1/



2

Điểm: 5 + 5 = 10

Mất nửa tiếng để tìm hiểu nhưng tôi thực sự rất vui vì mình đã làm :)

1 là: /j.$/

Thứ 2 là: /^.j/

Cái thứ nhất khớp với một jxảy ra ở vị trí thứ hai bắt đầu từ bên phải. Trận đấu thứ 2 jxảy ra ở vị trí thứ hai bắt đầu từ bên trái.

Tôi chưa thử nghiệm nhưng tôi nghĩ rằng các RegEx này thực sự linh hoạt vì jcó thể thay thế bằng bất kỳ \wký tự nào (hoặc hơn?) Và vẫn hoạt động tốt.

PS Điều này sẽ (hy vọng) hoạt động trong bất kỳ ngôn ngữ. Mặc dù, nếu nó không hoạt động trong bất kỳ, xin vui lòng thông báo trong các ý kiến ​​dưới đây :)

Kiểm tra


Và tôi nhận ra rằng @Quiccunx đã đăng phiên bản giống như của tôi. Tôi thực sự xin lỗi Quiccunx và nếu nó vui lòng, tôi sẽ xóa câu trả lời của mình.
Gaurang Tandon

1

PCRE sử dụng công cụ sửa đổi x: 11 ký tự

/\s/
/ s.$/x

Chuỗi đầu tiên khớp với bất kỳ chuỗi nào có ký tự khoảng trắng, nhưng không chứa khoảng trắng. Cái thứ hai chứa khoảng trắng, nhưng nó bị bỏ qua vì bộ xsửa đổi; nó phù hợp với bất kỳ chuỗi nào có đặc tính áp chót s.

PCRE và các công cụ khác sử dụng các lớp ký tự: 11 ký tự

/\w+w/
/\Ww/

Chuỗi đầu tiên khớp với bất kỳ chuỗi nào có ký tự "từ" (chữ cái, chữ số, dấu gạch dưới) theo sau là một chữ w; chuỗi thứ hai khớp với bất kỳ chuỗi nào có ký tự không phải từ theo sau bằng chữ w.

PCRE và các công cụ khác sử dụng các lớp ký tự và neo ranh giới từ: 11 ký tự

/\w\w/
/\bw/

Chuỗi đầu tiên khớp với bất kỳ chuỗi nào có hai ký tự "từ" liên tiếp; chuỗi thứ hai bất kỳ có ký tự không phải từ hoặc bắt đầu chuỗi theo sau bằng chữ w.


-1

ECMAScript (11 byte):

/^\1?d/
/\d/

Các công cụ REGEXP khác (14 byte):

/^\\\\1?d/
/\d/

Trận đấu đầu tiên \ d [..] hoặc \ 1d [..].

Chuỗi thứ hai khớp với bất kỳ chuỗi nào có số.

CHỈNH SỬA:

Ban đầu, câu trả lời này được đăng là tương thích với tất cả các động cơ, nhưng nó đã được chứng minh là sai.

Có một vấn đề với các tham chiếu đến các nhóm bắt giữ (ví dụ, trong php).


Nhiều công cụ regex lấy regex mà không có dấu gạch chéo xung quanh, nhưng câu hỏi khá rõ ràng trong việc yêu cầu chúng được tính.
Peter Taylor

Tôi không tính nó là một câu trả lời. Hãy để tôi thêm ghi chú cho điều đó.
Ismael Miguel

1
@PeterTaylor Tôi đã thêm ghi chú. Phiên bản Apache là có bởi vì.
Ismael Miguel

Đợi đã: trong động cơ nào thì phân tích đầu tiên \1không được hiểu là tham chiếu ngược?
Peter Taylor

Tùy thuộc vào cách bạn sử dụng nó. Ví dụ, trong php, nếu bạn đặt vào bên trong, "/^\1?d/"bạn sẽ gặp rắc rối, nhưng nếu bạn làm vậy '/^\1?d/'thì không sao. Các trích dẫn tạo ra một sự khác biệt rất lớn khi mã được diễn giải.
Ismael Miguel
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.