2008-09-11 44 views
6

Chúng tôi đã có một kịch bản yêu cầu chúng tôi phân tích nhiều email (văn bản thuần túy), mỗi loại 'e-mail' là kết quả của một tập lệnh đang chạy trên các nền tảng khác nhau. Một số được phân cách bằng tab, một số được phân tách bằng không gian, một số chúng ta chưa biết.Cách tốt nhất để phân tích chuỗi là gì?

Chúng tôi cũng sẽ cần hỗ trợ thêm 'định dạng' trong tương lai.

Đỗ chúng tôi đi kiếm một giải pháp sử dụng:

  • Regex
  • Đơn giản chỉ cần chuỗi tìm kiếm (sử dụng String.IndexOf vv)
  • Lex/Yacc
  • khác

Các tổng thể giải pháp sẽ được phát triển trong C# 2.0 (hy vọng 3.5)

Trả lời

4

Ba giải pháp mà bạn đã đề cập mỗi yêu cầu rất khác nhau.

Phân tích thủ công (tìm kiếm văn bản đơn giản) linh hoạt nhất và dễ thích nghi nhất, tuy nhiên, nó nhanh chóng trở thành nỗi đau thực sự trong ass khi phân tích cú pháp được yêu cầu phức tạp hơn.

Regex là nền tảng trung bình và có lẽ là cược tốt nhất của bạn tại đây. Chúng mạnh mẽ, nhưng linh hoạt như bạn có thể tự thêm logic hơn từ mã gọi regex khác nhau. Hạn chế chính sẽ là tốc độ ở đây.

Lex/Yacc thực sự chỉ thích nghi với các cú pháp rất phức tạp, có thể dự đoán được và thiếu rất nhiều tính linh hoạt sau khi biên dịch. Bạn không thể dễ dàng thay đổi phân tích cú pháp trong phân tích cú pháp giữa, thực ra bạn có thể nhưng nó quá nặng và bạn nên sử dụng regex tốt hơn.

Tôi biết đây là một câu trả lời câu trả lời, tất cả đều thực sự đáp ứng nhu cầu chính xác của bạn, nhưng từ những gì bạn nói, cá nhân tôi có thể đi với một túi regex.

Là một thay thế, như Vaibhav poionted ra, nếu bạn có những tình huống khác nhau mà có thể phát sinh và bạn cna dễ dàng phát hiện mà người ta đang đến, bạn có thể làm cho một hệ thống plugin cho phép lựa chọn các thuật toán đúng, và những thuật toán tất cả có thể rất khác nhau, một bằng cách sử dụng Lex/Yacc trong trường hợp khó khăn và một bằng cách sử dụng IndexOf và regex cho các trường hợp đơn giản hơn.

5

Regex.

Regex có thể giải quyết hầu hết mọi thứ ngoại trừ hòa bình thế giới. Cũng có lẽ hòa bình thế giới nữa.

+1

Tôi nghe nói Regex chịu trách nhiệm về việc bế bức tường Berlin. –

+0

Họ thực sự nên ngừng sử dụng vũ khí hạt nhân trong các bộ phim thảm họa. – Coincoin

+1

Regex: Nguyên nhân và giải pháp cho tất cả các vấn đề của cuộc sống. – MatthewKing

0

Regex có thể là bạn đã đặt cược, thử và chứng minh. Cộng với một biểu thức chính quy có thể được biên dịch.

1

Có thể bạn nên có một hệ thống có thể cắm được bất kể loại phân tích cú pháp chuỗi nào bạn sử dụng. Vì vậy, hệ thống này kêu gọi 'plugin' phù hợp tùy thuộc vào loại email để phân tích cú pháp.

-1

Với ít thông tin bạn cung cấp, tôi sẽ chọn Regex.

Nhưng những loại thông tin mà bạn muốn phân tích và những gì bạn muốn làm sẽ thay đổi quyết định để Lex/Yacc lẽ ..

Nhưng có vẻ như bạn đã thực hiện suy nghĩ của bạn lên với String tìm kiếm :)

0

Đặt cược tốt nhất của bạn là RegEx bởi vì nó cung cấp mức độ linh hoạt cao hơn nhiều so với bất kỳ tùy chọn nào khác.

Trong khi bạn có thể sử dụng để xử lý IndexOf somethings, bạn có thể nhanh chóng tìm thấy chính mình viết code đó trông giống như:

if(s.IndexOf("search1")>-1 || s.IndexOf("search2")>-1 ||...

Điều đó có thể được xử lý theo một tuyên bố RegEx. Ngoài ra, có rất nhiều địa điểm như RegExLib.com nơi bạn có thể tìm thấy những người đã chia sẻ các biểu thức chính quy để giải quyết các vấn đề.

1

Bạn phải kiến ​​trúc sư giải pháp của mình để có thể cập nhật, để bạn có thể xử lý các tình huống không xác định khi chúng xén. Tạo một giao diện cho các trình phân tích cú pháp không chỉ chứa các phương thức phân tích cú pháp các email và trả về kết quả theo định dạng chuẩn mà còn để kiểm tra email để xác định xem trình phân tích cú pháp có thực thi hay không.

Trong cấu hình của bạn, hãy xác định loại trình phân tích cú pháp bạn muốn sử dụng, đặt tùy chọn cấu hình và cấu hình cho số nhận dạng xác định xem trình phân tích cú pháp có hoạt động hay không. Đặt tên cho các trình phân tích cú pháp bằng cách lắp ráp tên đủ điều kiện để các kiểu có thể được khởi tạo trong thời gian chạy ngay cả khi không có các liên kết tĩnh đến các assembly của chúng.

Mã định danh cũng có thể triển khai giao diện, do đó bạn có thể tạo các loại khác nhau để kiểm tra những thứ khác nhau. Ví dụ: bạn có thể tạo một số nhận dạng regex, phân tích cú pháp email cho một mẫu cụ thể. Đảm bảo cung cấp càng nhiều thông tin có sẵn cho số nhận dạng để có thể đưa ra quyết định về những thứ như từ địa chỉ cũng như nội dung của email.

Khi trình phân tích cú pháp đã biết của bạn không thể xử lý công việc, hãy tạo một DLL mới với các kiểu thực hiện giao diện trình phân tích cú pháp và định danh có thể xử lý công việc và thả chúng vào thư mục bin của bạn.

1

Tùy thuộc vào những gì bạn đang phân tích cú pháp. Đối với bất cứ điều gì ngoài những gì Regex có thể xử lý, tôi đã sử dụng ANTLR. Trước khi bạn nhảy vào phân tích cú pháp gốc đệ quy lần đầu tiên, tôi sẽ nghiên cứu cách chúng hoạt động, trước khi cố gắng sử dụng một khung như thế này. Nếu bạn đăng ký tạp chí MSDN, hãy kiểm tra vấn đề tháng 2 năm 2008, nơi họ có một bài viết viết một từ đầu.

Sau khi bạn hiểu, việc học ANTLR sẽ dễ dàng hơn nhiều. Có những khuôn khổ khác ngoài kia, nhưng ANTLR dường như có sự hỗ trợ cộng đồng và tài liệu công cộng nhất. Tác giả cũng đã xuất bản The Definitive ANTLR Reference: Building Domain-Specific Languages.

0

@Coincoin đã bao gồm các cơ sở; Tôi chỉ muốn thêm rằng với regex nó đặc biệt dễ dàng để kết thúc với khó đọc, khó duy trì mã. Regex là một ngôn ngữ mạnh mẽ và rất nhỏ gọn, vì vậy đó là cách nó thường đi.

Sử dụng khoảng trống và nhận xét trong regex có thể đi một chặng đường dài để giúp dễ dàng duy trì các regex. Eric Gunnerson đã biến tôi thành ý tưởng này. Đây là an example.

0

Sử dụng PCRE. Tất cả các câu trả lời khác chỉ là 2 Tốt nhất.

+0

Bạn có thể thêm lý do không? – Kieron

+0

Nó cho phép bạn thực hiện các loại tìm kiếm khác nhau Văn bản, Regex, v.v. Đây là thư viện được biên dịch cho phép bạn thực hiện rất nhiều thứ trên nhiều nền tảng và đã được thử nghiệm trong nhiều năm. Nó có thể sẽ nhanh hơn nhiều so với việc thực hiện bạn sẽ viết. – Geek

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