Vấn đề
Không có cách nào dễ dàng để có được hoán vị với regex.
- Hoán vị: Bắt một từ ("aabc") sang một thứ tự khác, mà không thay đổi số lượng hoặc loại chữ cái.
- Regex: Biểu thức chính quy.
Để xác minh:
- "Hoán vị Regex mà không lặp lại" Câu trả lời tạo mã JavaScript thay vì regex, giả sử điều này sẽ đơn giản hơn.
- "Cách tìm tất cả các hoán vị của một từ nhất định trong một văn bản nhất định" - Câu trả lời cũng không sử dụng biểu thức chính quy.
- "Regex để khớp tất cả {1, 2, 3, 4} mà không lặp lại" - Câu trả lời sử dụng regexes, nhưng nó không thích ứng cũng không đơn giản.
- Câu trả lời này thậm chí còn tuyên bố: "Một biểu thức chính quy không thể thực hiện những gì bạn yêu cầu. Nó không thể tạo ra hoán vị từ một chuỗi" .
Loại giải pháp tôi đang tìm kiếm
Nó nên có dạng:
- »Aabc« (hoặc bất cứ điều gì khác mà bạn có thể sử dụng dấu ngoặc đơn mở và đóng)
- (aabc)! (tương tự (abc)? nhưng cuối cùng có một biểu tượng khác)
- [aabc]! (tương tự như [abc] + nhưng cuối cùng có một biểu tượng khác)
Ưu điểm của các giải pháp này
Họ đang:
- dễ dàng
- thích nghi
- tái sử dụng
Tại sao điều này nên tồn tại
- Regexes là một cách để mô tả một ngữ pháp của ngôn ngữ thông thường. Họ có toàn bộ sức mạnh để trở thành bất kỳ loại ngôn ngữ thông thường nào.
- Giả sử, ngôn ngữ thông thường đủ mạnh để hoán vị (bằng chứng bên dưới) - tại sao không có cách nào dễ dàng để diễn đạt điều này?
Vì vậy, câu hỏi của tôi là:
- (Tại sao) Bằng chứng của tôi sai?
- Nếu nó đúng: Tại sao không có cách dễ dàng để thể hiện hoán vị?
Bằng chứng
- Biểu thức chính quy là một cách để lưu ý ngữ pháp của ngôn ngữ thông thường. Họ có thể mô tả bất kỳ ngữ pháp thông thường.
- Một cách khác để mô tả bất kỳ ngôn ngữ thông thường nào (có số lượng chữ cái hữu hạn trong bảng chữ cái của chúng) ngữ pháp là Automatons không xác định (với số lượng trạng thái hữu hạn).
Có số lượng chữ cái hữu hạn tôi có thể tạo ra máy tự động này: (Ví dụ. Chính thức: xem bên dưới)
Ngữ pháp chấp nhận hoán vị của "abbc":
(sry cho số trên đầu, có thể ai đó biết làm thế nào để làm cho phần này nhìn tốt hơn)
s -> ah¹
s -> bh²
s -> ch³
h¹ -> bh¹¹
h¹ -> ch¹²
h² -> ah¹¹ (không có lỗi đánh máy!
h² -> bh²²
h² -> ch²³
h³ -> ah¹²
h³ -> bh²³
h¹¹ -> bc
h¹¹ -> cb
h¹² -> bb
h²² -> ac
h²² -> ca
h²³ -> ab
h²³ -> ba
Chính thức hơn: (sử dụng một máy tự động trạng thái hữu hạn nhưng điều này cũng có thể được thực hiện với ngữ pháp)
- Một từ q (có độ dài hữu hạn) mà bất kỳ hoán vị nào cũng sẽ đạt đến trạng thái chấp nhận.
- X là bảng chữ cái hữu hạn.
- Tập hợp các trạng thái S chứa bất kỳ thứ tự các chữ cái có độ dài bằng q. (Vì vậy, kích thước của S là hữu hạn.) Cộng với một trạng thái "bất kỳ từ nào dài hơn".
- chức năng chuyển trạng thái d trong đó lấy một chữ cái và di chuyển trên trạng thái tương ứng với phần hiện đang đọc của từ này.
- F là tập hợp các trạng thái đó là hoán vị chính xác của q.
Vì vậy, có thể tạo ra một máy tự động trạng thái hữu hạn để chấp nhận hoán vị của một từ nhất định.
Tiếp tục với bằng chứng
Vì vậy, tôi đã chứng minh rằng các ngôn ngữ thông thường có khả năng kiểm tra hoán vị, phải không?
Vậy tại sao không có cách tiếp cận nào để đạt được điều này với Regexes? Đây là một chức năng hữu ích.
^(a()|a()|b()|c()){4}\2\3\4\5$
dường như hoạt động (xem regex101.com/r/9URPpg/4/tests ).