Trong ứng dụng Python của tôi, tôi cần viết biểu thức chính quy khớp với vòng lặp C++ for
hoặc while
đã kết thúc bằng dấu chấm phẩy (;
). Ví dụ, nó phải phù hợp này:Biểu thức chính quy để phát hiện dấu chấm phẩy kết thúc C++ cho & trong khi vòng
for (int i = 0; i < 10; i++);
... nhưng không này:
for (int i = 0; i < 10; i++)
này trông tầm thường ở cái nhìn đầu tiên, cho đến khi bạn nhận ra rằng văn bản giữa việc mở và ngoặc đóng có thể chứa dấu ngoặc đơn khác, ví dụ:
for (int i = funcA(); i < funcB(); i++);
Tôi đang sử dụng mô đun python.re. Ngay bây giờ biểu hiện thường xuyên của tôi trông như thế này (tôi đã để lại những comment của tôi trong để bạn có thể hiểu dễ dàng hơn):
# match any line that begins with a "for" or "while" statement:
^\s*(for|while)\s*
\( # match the initial opening parenthesis
# Now make a named group 'balanced' which matches a balanced substring.
(?P<balanced>
# A balanced substring is either something that is not a parenthesis:
[^()]
| # …or a parenthesised string:
\(# A parenthesised string begins with an opening parenthesis
(?P=balanced)* # …followed by a sequence of balanced substrings
\) # …and ends with a closing parenthesis
)* # Look for a sequence of balanced substrings
\) # Finally, the outer closing parenthesis.
# must end with a semi-colon to match:
\s*;\s*
này hoạt động hoàn hảo cho tất cả các trường hợp trên, nhưng nó phá vỡ ngay khi bạn cố gắng và làm phần thứ ba của vòng lặp for chứa một hàm, giống như vậy:
for (int i = 0; i < 10; doSomethingTo(i));
Tôi nghĩ rằng nó vỡ vì ngay khi bạn đặt một số văn bản giữa dấu ngoặc đơn mở và đóng, nhóm "cân bằng" khớp với văn bản có chứa, và do đó phần (?P=balanced)
không hoạt động nữa vì nó sẽ không khớp (do thực tế là văn bản bên trong dấu ngoặc đơn là khác nhau).
Trong mã Python của tôi Tôi đang sử dụng cờ VERBOSE và MULTILINE, và tạo ra các biểu thức chính quy như sau:
REGEX_STR = r"""# match any line that begins with a "for" or "while" statement:
^\s*(for|while)\s*
\( # match the initial opening parenthesis
# Now make a named group 'balanced' which matches
# a balanced substring.
(?P<balanced>
# A balanced substring is either something that is not a parenthesis:
[^()]
| # …or a parenthesised string:
\(# A parenthesised string begins with an opening parenthesis
(?P=balanced)* # …followed by a sequence of balanced substrings
\) # …and ends with a closing parenthesis
)* # Look for a sequence of balanced substrings
\) # Finally, the outer closing parenthesis.
# must end with a semi-colon to match:
\s*;\s*"""
REGEX_OBJ = re.compile(REGEX_STR, re.MULTILINE| re.VERBOSE)
bất cứ ai có thể đề xuất một sự cải tiến để biểu thức chính quy này? Nó trở nên quá phức tạp đối với tôi để có được đầu của tôi xung quanh.
Cảm ơn - Tôi đoán biểu thức chính quy thực sự là công cụ sai cho công việc! – Thomi
Bạn cũng cần tính đến các chú thích và chuỗi tài khoản, cả hai đều sẽ giải thích thuật toán này. –
Bạn có thể xóa nhận xét và chuỗi trước bằng cụm từ thông dụng. :) Hoặc giới thiệu nhiều biến hơn như openBr, cho biết nếu bạn đang ở trong một nhận xét (và loại nhận xét nào, vì vậy bạn biết ký tự nào đóng nó) hoặc một chuỗi. – Frank