2010-09-02 43 views
6

tôi đang gặp khó khăn xây dựng một biểu thức chính quy với các thiết lập của chuỗi trên {a, b, c} đó là một chiều dài odd với chính xác một a. Đây là nỗ lực hết sức mình cho đến nay:Xác định xem chuỗi là chẵn hoặc lẻ chiều dài với biểu thức chính quy

(bb|bc|cb|cc)*a(bb|bc|cb|cc)* 

này không tốt cho dù bc ở hai bên của a, nhưng không chiếm lẻ bc kết hợp ở hai bên của a.

Bất kỳ gợi ý nào?

Trả lời

4

chuỗi của bạn sẽ trở thành một tiền tố Tiếp theo một theo sau là một hậu tố .

Cả hai tiền tố tiền tốhậu tố có thể bằng không. Nếu không, họ phải là cả hai hoặc thậm chí cả hai hoặc không đồng đều. Điều này có nghĩa là bạn có hai trường hợp chính.

EVENPREFIX a EVENSUFFIX | UNEVENPREFIX a UNEVENSUFFIX 

Hãy thử điều này (không đầy đủsai):

([bc][bc])*a([bc][bc])*|([bc][bc][bc])*a([bc][bc][bc])* 

Hiện vẫn còn là một trong những trường hợp không đồng đều thiếu: a single [bc]:

(([bc][bc])*a([bc][bc])*)|([bc]([bc][bc])*a[bc]([bc][bc])*) 

Theo http://www.fileformat.info/tool/regex.htm, đây đối sánh

  • a
  • cac
  • ccabb

Tôi hy vọng nó phù hợp với phần còn lại quá ...

Các trái đảm bảo bên thậm chí (hoặc trống) chuỗi b hoặc c. Phía bên phải là một đơn b hoặc c, sau đó là một bội số của hai (để nó không đồng đều).

Kobi đã đưa ra sự tinh tế này của trên:

([bc][bc])*(a|[bc]a[bc])([bc][bc])* 

làm việc như thế này?

Nhóm đầu tiên được đảm bảo là ngay cả. Nhóm thứ hai được đảm bảo không đồng đều với một đơn a bên trong. Nhóm thứ ba được đảm bảo là ngay cả. Vì vậy, toàn bộ được đảm bảo là không đồng đều.

+1

Bạn có thể đơn giản hóa điều đó thành '([bc] [bc]) * (a | [bc] a [bc]) ([bc] [bc]) *' - chỉ áp dụng thay thế cho nơi bạn cần. – Kobi

+0

Dấu ngoặc vuông sẽ không hoạt động vì điều đó có nghĩa là khớp chính xác một lần.Chuỗi 'a' của chính nó phải là một chuỗi hợp lệ vì nó là số lẻ, regex của bạn không tự tính. – ubiquibacon

+0

@Kobi Phải. Cảm ơn bạn đã chỉ ra rằng. Đây là một con đường suy nghĩ khác nhau, mặc dù ... –

Các vấn đề liên quan