2013-03-03 18 views
5

mô hình này:Thực hiện một RegEx không tham lam theo hướng ngược cư xử giống nhau như trong phía trước hướng

/a+?b+?/ 

Against the chuỗi sau:

aaaaaabbbbbb 

Matches:

aaaaaab 

Chúng ta thấy rằng các hành vi không tham lam khác nhau theo hướng ngược lại/trái (mất tất cả) và hướng chuyển tiếp/phải (chỉ mất một).

Có cách nào để không tham lam ngay từ đầu, phù hợp với tất cả a, để khớp với ít nhất có thể không? Vì vậy, nó hoạt động trong cùng một cách như ở với phần b ở cuối?

Trả lời

1

Chúng do hoạt động giống nhau! Một lượng hóa lười biếng (trong trường hợp này một lười biếng +) cho động cơ regex để

  • bắt đầu ở vị trí có thể đầu tiên,
  • sau đó kết hợp càng ít nhân vật càng tốt (ít nhất một trong các trường hợp của một +)
  • nhưng khớp với số lượng cần thiết để cho phép khớp tổng thể xảy ra.

Các quy tắc không khớp "trái" hoặc "lùi", như bạn có vẻ ngụ ý.

Chính xác bạn đang cố gắng đạt được điều gì? Tôi đoán nó không phải là ví dụ đơn giản này - đó sẽ là tầm thường để sửa chữa (chỉ cần thực hiện các regex ab, mà có lẽ không phải là những gì bạn đang tìm kiếm).

+0

Tôi muốn biết một cách tổng quát về cách để có được càng ít dưới dạng kết hợp có thể ở phía bên trái với 'a'. Tất nhiên, đây chỉ là một ví dụ. – flori

+1

Bạn có thể đưa ra một ví dụ hợp lý không? Sau đó, nó có thể có thể cho bạn thấy một giải pháp có ý nghĩa. –

+0

@flori: Bạn cần bằng cách nào đó từ chối trận đấu 'aaaaaab', 'aaaaab', ...' aab', để khớp 'ab', nếu đó là điều bạn muốn. Trong trường hợp này, tôi sẽ đi với 'indexOf (" ab ")'. – nhahtdh

2

Regexes thường khớp từ trái sang phải trừ khi bạn đặt cờ từ phải sang trái (rất ít hỗ trợ hương vị). Trong cả hai trường hợp, chúng không bắt đầu ở giữa và sau đó làm việc theo cả hai hướng, ngay cả khi bạn sử dụng một lookbehind.

Giúp dừng và hỏi - tại sao số liệu định lượng lười biếng tồn tại ở vị trí đầu tiên? Vấn đề là gì để giải quyết?

Công cụ định lượng thông thường (tham lam) hoạt động bằng cách tìm mẫu văn bản phù hợp và sau đó liên tục khớp chuỗi ký tự cho đến khi chúng không khớp được nữa. Hành vi này thường được mong muốn, nhưng bạn gặp phải các vấn đề khi bạn có một mẫu rất chung theo sau là một mẫu rất cụ thể trong đó mẫu cụ thể là một tập hợp con của mẫu chung.

Ví dụ, hãy xem xét đầu vào sau:

_abc_END_def_END 

Và mô hình này:

(\w+END)(\w+END)? 

Mục đích, nó rất dễ dàng để giả định, là để phù hợp với _abc_ và sau đó END, tiếp theo là _def_ và sau đó END. Biểu thức này sẽ xuất hiện để cho phép đầu vào trong đó tập ký tự thứ hai là tùy chọn.

Vấn đề là END là một tập hợp con của \w+, vì vậy tập thứ hai là thực sự "tiêu thụ" bởi \w+, dẫn đến _abc_END_def_ bị phù hợp, tiếp theo là END. Đây không phải là hành vi mong muốn.

Giải pháp cho kịch bản này là thay đổi cách trình định lượng hoạt động với công cụ sửa đổi chậm. Điều này cung cấp cho mô hình END một cơ hội để khớp với mỗi ký tự và chỉ cho phép \w+ tiêu thụ một ký tự khác nếu END không thành công.

Mục đích của trình định lượng lười không khớp với số ký tự "tối thiểu" - đó là về việc đưa mẫu thứ hai đó, một tập hợp con đầu tiên, một cơ hội để khớp.

Trong ví dụ của bạn, b không phải là tập hợp con của a, vì vậy không cần thiết cho trình định lượng lười. Nếu bạn muốn kết hợp một hoặc nhiều hơn một, nhưng càng ít càng tốt, và một hoặc nhiều b, nhưng càng ít càng tốt, sau đó bạn chỉ đơn giản là muốn sử dụng:

ab 

Hoặc, nếu bạn a là một lập trường -trong đối với một số siêu có thể bao gồm b:

[ab]b 

Ví dụ:

\wb 

Cả hai trong số đó sẽ phù hợp:

ab 
1

Nếu bạn không có khả năng thực hiện đối sánh từ phải sang trái được đề cập trước đó, bạn có thể chỉ cần đảo ngược chuỗi, đảo ngược biểu thức regex, sau đó đảo ngược kết quả ở cuối.

Công việc là như sau:

Start with aaaaaabbbbbb 
Reverse to bbbbbbaaaaaa 
Reverse /a+?b+?/ to /b+?a+?/ 
The resulting Match is bbbbbba 
Reverse the resulting match to get abbbbbb 
Các vấn đề liên quan