Bạn nên sử dụng trình phân tích cú pháp khi bạn quan tâm đến ý nghĩa từ ngữ hoặc ngữ nghĩa từ vựng hoặc ngữ nghĩa của văn bản, khi các mẫu có thể thay đổi. Phân tích cú pháp thường quá mức cần thiết khi bạn chỉ đơn giản là tìm kiếm khớp hoặc thay thế mẫu ký tự, bất kể ý nghĩa chức năng của chúng.
Trong trường hợp của bạn, bạn có vẻ quan tâm đến ý nghĩa đằng sau văn bản ("thành phần chức năng" của mã), do đó, trình phân tích cú pháp sẽ là lựa chọn tốt hơn. Tuy nhiên, các trình phân tích cú pháp có thể sử dụng regex trong nội bộ, vì vậy chúng không nên được coi là loại trừ lẫn nhau.
Tuy nhiên, trình phân tích cú pháp "" không tự động có nghĩa là nó phức tạp. Ví dụ: nếu bạn quan tâm đến các khối mã C, bạn có thể phân tích cú pháp các nhóm lồng nhau của {và}. Trình phân tích cú pháp này sẽ chỉ quan tâm đến hai thẻ ('{' và '}') và các khối văn bản giữa chúng.
Tuy nhiên, so sánh regex đơn giản không đủ ở đây do ngữ nghĩa lồng nhau. Hãy lấy đoạn mã sau:
void Foo(bool Bar)
{
if(Bar)
{
f();
}
else
{
g();
}
}
Trình phân tích cú pháp sẽ hiểu phạm vi tổng thể của Foo, cũng như mỗi phạm vi bên trong chứa trong Foo (nếu và khối khác). Khi nó gặp phải mỗi '' token, nó "hiểu" ý nghĩa của chúng. Một tìm kiếm đơn giản, tuy nhiên không hiểu được ý nghĩa đằng sau những văn bản và có thể giải thích sau đây để trở thành một khối, mà chúng tôi đương nhiên biết là không đúng:
{
if(Bar)
{
f();
}
Nguồn
2009-04-11 12:35:19
Không chính xác chắc chắn nếu đó là bản sao - nhưng hãy kiểm tra các bài đăng sau đây: * [Khi nào là một vấn đề quá phức tạp cho một biểu thức chính quy?] (Http: // stackoverflow.com/questions/230517/khi-là-một-vấn đề-quá phức tạp-cho-một-regular-expression) * [Giải pháp thay thế cho biểu thức chính quy] (http://stackoverflow.com/questions/514313/alternatives-to biểu thức không đều) – dirkgently