Regex nghịch đảo của lãi kép


9

Koronkorko là từ tiếng Phần Lan có nghĩa là lãi kép . Chúng tôi không muốn lãi kép trong chuỗi của chúng tôi, vì vậy hãy tìm biểu thức chính quy ngắn nhất có thể để loại trừ nó.

Cho một chuỗi chỉ bao gồm các ký tự chữ cái in hoa AZ, xác định biểu thức chính quy ngắn nhất có thể phù hợp với chuỗi nếu nó không chứa chuỗi con KORONKORKO. Bất kỳ chuỗi nào chứa KORONKORKOdưới dạng chuỗi con không được khớp với biểu thức chính quy.

Chỉ có nhân vật A- Z, [, ], -, ^, , ?, *, +, |, (, và )nên được sử dụng trong biểu thức.

Tôi nghĩ rằng điều này có thể được thực hiện với 118 ký tự trong biểu thức. Bạn có thể làm cho nó ngắn hơn?

Lưu ý: Thử thách này là của Ohjelmointiputka (tiếng Phần Lan).


Nếu !là một ký tự được phép, bạn có thể thực hiện được ^((?!KORONKORO).)*$19 byte.
Mama Fun Roll

3
@MamaFunRoll Tôi nghĩ đó là lý do tại sao ! không cho phép.
Alex A.

Tôi đã rất vui khi cố gắng làm việc theo cách của mình trên trang web của Phần Lan và tôi tin rằng những gì bạn đang tìm kiếm là các biểu thức regex lý thuyết khớp / từ chối chuỗi đầu vào. Ví dụ: trang web dường như chỉ cho phép sử dụng -^bên trong các lớp ký tự (vì vậy ^không thể được sử dụng làm mỏ neo) và một trận đấu chỉ được tính nếu toàn bộ chuỗi được khớp với biểu thức chính quy (nghĩa là một ẩn xung quanh ^$, như trái ngược với "regexes" thông thường, tính một chuỗi là khớp nếu bất kỳ phần nào của chuỗi khớp với regex)
Sp3000

Như vậy, tôi đã xóa câu trả lời PCRE của mình, trong khi nó hoạt động ngay cả trong PHP, gần như chắc chắn là ngoài ý muốn trong trường hợp này.
Sp3000

Tôi quên nói rằng trang web kiểm tra xem biểu thức có hợp lệ bởi hàm ereg của PHP không. Nó đã được nói trong cuộc thảo luận trong ohjelmointiputka.net/keskustelu/ chì
khách

Câu trả lời:


6

204 ký tự

(K((O(R(O(NKORO)*(NK(O(RK)?)?)?)?)?)?K)*(O(R(O(NKORO)*(N(K(O(RK?[^KO]|[^KR])|[^KO])|[^K])|[^KN])|[^KO])|[^KR])|[^KO])|[^K])*(K((O(R(O(NKORO)*(NK(O(RK)?)?)?)?)?)?K)*(O(R(O(NKORO)*(N(K(O(RK?)?)?)?)?)?)?)?)?

Được tạo ra bằng cách biến .*KORONKORKO.*thành một máy trạng thái hữu hạn, đảo ngược máy trạng thái hữu hạn và biến nó trở lại thành một biểu thức chính quy.


Tại sao điều này trở thành câu trả lời tốt nhất?
Bálint

1

Python, 77 79 97 118 byte

Chỉnh sửa 3: Viết lại. Sử dụng cái nhìn lồng nhau

^([^K]|K(?=$|[^O]|O(?=$|[^R]|R(?=$|[^O]|O(?=$|[^N]|N(?=$|[^K]|K(?=$|[^O]|O(?=$|[^R]|R(?=$|[^K]|K(?=$|[^O]))))))))))*$

Regex 101

Chỉnh sửa 2: Đã thêm '$ |' trong suốt regex. Bây giờ, nếu một tiền tố của KORONKORKO đã được khớp, mục tiếp theo phù hợp là kết thúc chuỗi, một ký tự kết thúc tiền tố hoặc một ký tự mở rộng tiền tố nếu nó được theo sau bởi một cái gì đó kết thúc tiền tố.

Regex này hoạt động với re.fullmatch(), được thêm vào trong Python 3.4. Để sử dụng với re.match(), ^$cần phải được thêm vào đầu và cuối của mẫu, tương ứng, cho thêm 2 byte.

([^K]|K($|[^O]|O($|[^R]|R($|[^O]|O($|[^N]|N($|[^K]|K($|[^O]|O($|[^R]|R($|[^K]|K($|[^O]))))))))))*

Liên kết Regex101

Giải pháp không chính xác trước đây (xem bình luận):

K|([^K]|K([^O]|O([^R]|R([^O]|O([^N]|N([^K]|K([^O]|O([^R]|R([^K]|K[^O])))))))))*

Chỉnh sửa: Đã thêm K đơn


2
Tôi không tin trận đấu này K.
orlp

@orip - Bắt tốt. Đã sửa.
RootTwo

Cập nhật mới nhất hiện không thành công choKKORONKORKO
Sp3000

Có sửa được không? Có ý kiến ​​gì không?
RootTwo

1
Bắt đầu ^và kết thúc $không cần thiết. Ngoài ra, =$không được phép.
LegionMammal978
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.