Tôi đang tìm một API đối sánh chuỗi ký tự đại diện (không phải đối sánh regex). Tôi không thể sử dụng bất cứ thứ gì ngoài Win32 APIs.Win32 API để thực hiện đối sánh chuỗi ký tự đại diện
Trả lời
Các FindFirstFile
và FindNextFile
API thực hiện các đối sánh ký tự đại diện, nhưng chỉ chống lại tên tệp.
Bạn không thể sử dụng mọi thứ nhưng Win32? Còn STL hoặc CRT thì sao? Bạn đang sử dụng Boost?
Nếu không có giới hạn API Win32, tôi khuyên bạn nên sử dụng mã từ một số dự án nguồn mở. Một lựa chọn khác sẽ là dịch glob thành một regex, mà tôi tin rằng có thể được thực hiện với một hoạt động thay thế regex.
chỉnh sửa: Đầu tiên google trận đấu là mã PHP:
Vậy chính xác là yêu cầu của bạn? Bạn chỉ đang tìm cách sử dụng ký hiệu '' để khớp với 0 hoặc nhiều ký tự hơn hoặc bạn đang lập kế hoạch sử dụng '?' biểu tượng là tốt. Nếu đó chỉ là '', bạn có cần tìm kiếm a, a, một b, một kiểu mẫu b * c, v.v ... không? Nếu yêu cầu của bạn bị hạn chế, bạn có thể dễ dàng thoát khỏi hàm strstr của thư viện thời gian chạy C++.
Điều đơn giản nhất là nên chỉ chuyển đổi mô hình glob của bạn đến một regex, theo các quy tắc sau:
*
trở thành.*
?
trở thành.
- Bất cứ
\|.^$+()[]{}
đang trốn thoát bằng cách đặt trước họ với\
Điều này đúng một phần.
quy tắc Dưới đây là giới thiệu từ hành vi DIR trong XP + Command Prompt:
*
cũng giống như *.*
và trở thành regex .+
?
trở thành regex .?
trừ khi theo sau là một phi wildcard
?
không theo sau là một ký tự đại diện trở nên regex .
*.
có nghĩa là "không có phần mở rộng", và trở thành [^.]+$
có PathMatchSpec - nhưng xử lý chuyên cho các tệp, vì vậy kết quả có thể không phải là những gì bạn mong đợi nếu bạn cần khớp với ký tự đại diện chung.
Nếu không, bạn có thể nên đi với RegEx, như Pavel đã nêu chi tiết.
[sửa] tôi sai giả PathMatchSpec
cổ phiếu các thuộc tính của FindFirstFile/FindNextFile. Tôi đã chạy một vài bài kiểm tra - nó không. Vì vậy, nó trông giống như ứng cử viên tốt nhất.
Một tìm kiếm rất thú vị. Tôi tự hỏi làm thế nào là điều đó chuyên cho đường dẫn, mặc dù (nếu nó thực sự là). –
Pavel, tôi đã kiểm tra - việc xử lý đặc biệt chỉ có trong FindFirst/NextFile. Yay! : D – peterchen
Xử lý đặc biệt là gì? Tôi không hiểu tại sao nó sẽ không giống nhau? Bạn có nghĩa là nó chỉ áp dụng cho phần tên tệp trong FindFirst/NextFile? – paulm
Lạ mà rất nhiều năm trôi qua và không ai đưa cho bạn câu trả lời này :
Có API WIN32 thực hiện chính xác những gì bạn đang tìm kiếm. (Tôi thấy nó tìm kiếm trong MSDN cho "ký tự đại diện")
Tên của nó là SymMatchString()
. Nó nằm trong DbgHelp.dll là một phần của hệ điều hành.
Đặt một khía cạnh quan trọng xung quanh cuộc gọi API nếu ứng dụng của bạn được so sánh!
http://msdn.microsoft.com/en-us/library/windows/desktop/ms681355%28v=vs.85%29.aspx
API mà FindFirstFile()
sử dụng nội bộ cho các ký tự đại diện phù hợp có lẽ là FsRtlIsNameInExpression()
.
Elmü
DbgHelp có thể là một phần của hệ điều hành. Thật không may, MS có điều này để nói: "Mặc dù DLL này được bao gồm trong tất cả các phiên bản được hỗ trợ của Windows, nó hiếm khi là phiên bản mới nhất của DbgHelp có sẵn. Hơn nữa, phiên bản của DbgHelp mà tàu trong Windows đã giảm chức năng từ các phiên bản khác - cụ thể là nó thiếu sự hỗ trợ cho Symbol Server và Source Server.' "Cá nhân, tôi sẽ không cảm thấy thoải mái khi triển khai một giải pháp sử dụng API này trong những điều kiện như vậy. –
Có bao nhiêu ứng dụng được chạy trên SymbolServer hoặc SourceServer? Nếu bạn thực sự lo lắng về điều đó bạn có thể cài đặt một phiên bản đã biết của DbgHelp.dll vào thư mục của chương trình của bạn và điều này sẽ được nạp thay vì DLL của hệ điều hành. – Elmue
Ý bạn là gì bởi "kết hợp chuỗi ký tự đại diện"? Xin cho ví dụ. –
Ví dụ hoặc (tốt hơn) là thông số kỹ thuật. Nếu bạn có nghĩa là các quy tắc giống nhau để gửi các ký tự đại diện trên Windows, nhưng không nói rõ như vậy, thì thường Neil sẽ nhấn cho một yêu cầu tốt hơn ;-) Ngoài ra, nó xảy ra với tôi rằng '*' và '? 'Trong tập tin globs don không khớp với ký tự dấu gạch chéo ngược - nó có thể ảnh hưởng đến câu trả lời cho dù bạn có muốn hành vi này hay không. –