2010-03-30 32 views
8

Tôi có một chuỗi đầu vào mà là một địa chỉ thư mục:Regular Expression có thể Longest Matching

Ví dụ: ProgramFiles/Micro/Telephone

Và tôi muốn để phù hợp với nó chống lại một danh sách các từ rất chặt chẽ:

Ví dụ: Tel|Tele|Telephone

Tôi muốn đối sánh với Telephone chứ không phải Tel. Ngay bây giờ regex của tôi trông như thế này:

my($output) = ($input =~ m/($list)/o); 

Các regex trên sẽ phù hợp với Tel. Tôi có thể làm gì để sửa chữa nó?

+0

Đặt đối sánh ưa thích của bạn trước tiên? – eyelidlessness

+0

Bạn đang làm việc bằng ngôn ngữ nào? – EsotericNonsense

+0

Đặt đối sánh ưa thích của bạn trước tiên không phải lúc nào cũng có thể - ví dụ: Tôi hiện đang tạo danh sách từ khóa có thể khớp với khái niệm "Số căn hộ"; dữ liệu của tôi đa ngôn ngữ và lộn xộn. Tôi có thể thấy "Flt" hoặc "Apartment" hoặc "Apt" hoặc "Số căn hộ" hoặc "Apartamento No" ... Danh sách tiếp tục! Đang cố gắng xây dựng và duy trì một biểu thức chính quy sẽ phù hợp với tất cả các khái niệm này, trong đó mọi thứ ở đúng thứ tự đúng là gần như không thể thực tế. – Nick

Trả lời

9

Nếu bạn muốn có một trận đấu hoàn toàn từ:

\b(Tel|Tele|Telephone)\b 

\b là một ranh giới từ zero-chiều rộng. Ranh giới từ trong trường hợp này có nghĩa là sự chuyển đổi từ hoặc thành một ký tự từ. Một ký tự từ (\w) là [0-9a-zA-Z_].

Nếu bạn chỉ muốn đối sánh với thời gian dài nhất trong một từ khớp một phần đặt dài nhất trước tiên. Ví dụ:

\b(Telephone|Tele|Tel) 

hoặc

(Telephone|Tele|Tel) 
+1

Danh sách của tôi không được đảm bảo để có từ dài nhất trước. – syker

+0

Ranh giới từ hoạt động tư duy. Nhưng tôi không thể làm theo lý do là tại sao nó hoạt động. – syker

+0

@syker nếu bạn muốn kết hợp từng phần, cách dễ nhất để xây dựng biểu thức là sắp xếp danh sách các từ, đảo ngược thứ tự và sau đó nối tất cả các từ với '|' ở giữa và điều đó sẽ cho thứ tự chính xác các từ lớn với các từ phù hợp nhỏ hơn. – cletus

2

Thay đổi đơn đặt hàng: Tel|Tele|Telephone-Telephone|Tele|Tel. Bằng thuật toán regexp, thay đổi được tìm kiếm từ trái sang phải, nếu tìm thấy một kết quả phù hợp, đó là nó, không phù hợp với tham lam. Ví dụ:/a | ab | abc/làm việc trên "abc" khớp với "a" thay vì "abc" tham lam nhất.

hoặc sử dụng các biểu thức phù hợp.

Tel(?:e(?:phone)?)? 
+0

mức độ an toàn khi dựa vào hành vi này? Là nó trong spec regex hoặc một cái gì đó ở đâu đó? Sẽ thật tuyệt khi tôi có thể dựa vào biểu mẫu '(XXX | XX | X)' cho những gì tôi đang thực hiện – Hashbrown

-1

Làm cách nào để tìm một kết quả phù hợp, miễn là kết quả dài nhất không ở bất kỳ đâu trong đầu vào? Một cái gì đó như:

Tìm điện thoại, HOẶC tìm điện thoại và tele khi điện thoại không ở bất kỳ nơi nào trong đầu vào. Vì vậy, để bắt đầu làm cho nó trông giống như một regex:.

(điện thoại) HOẶC ký tự mà không cần điện thoại, tiếp theo (tel | tele) tiếp theo là nhân vật mà không cần điện thoại

(điện thoại | * (điện thoại) {0 }. * (tel | tele). * (điện thoại) {0}. *)

Điều đó có ý nghĩa gì không?

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