2009-07-31 10 views
8

मैं वाइल्डकार्ड स्ट्रिंग मैच एपीआई (रेगेक्स मैच नहीं) की तलाश में हूं। मैं Win32 एपीआई के अलावा कुछ भी उपयोग नहीं कर सकता।वाइल्डकार्ड स्ट्रिंग मैच करने के लिए Win32 एपीआई

+1

"वाइल्डकार्ड स्ट्रिंग मैच" से आपका क्या मतलब है? कृपया उदाहरण दें। –

+1

उदाहरण या (अधिमानतः) एक विशिष्टता। यदि आप विंडोज पर वाइल्डकार्ड फाइल करने के लिए समान नियमों का मतलब रखते हैं, लेकिन स्पष्ट रूप से ऐसा नहीं कहें, तो आम तौर पर नील बेहतर आवश्यकताओं के लिए दबाएगा ;-) इसके अलावा, यह मेरे लिए होता है कि फ़ाइल ग्लब्स में '*' और '?' बैकस्लैश चरित्र से मेल नहीं खाता - यह जवाब को प्रभावित कर सकता है कि आप इस व्यवहार को चाहते हैं या नहीं। –

उत्तर

3

FindFirstFile और FindNextFile एपीआई वाइल्डकार्ड मैच करते हैं, लेकिन केवल फाइलनामों के खिलाफ।

आप कुछ भी लेकिन Win32 का उपयोग नहीं कर सकते हैं? एसटीएल या सीआरटी के बारे में क्या? क्या आप बूस्ट का उपयोग कर रहे हैं?

Win32 API प्रतिबंध के बिना, मैं कुछ ओपन-सोर्स प्रोजेक्ट से कोड का उपयोग करने की अनुशंसा करता हूं। एक और विकल्प ग्लोब को रेगेक्स में अनुवाद करना होगा, जो मुझे लगता है कि रेगेक्स प्रतिस्थापन ऑपरेशन के साथ किया जा सकता है।

संपादित करें:

http://cvs.php.net/viewvc.cgi/php-src/win32/

0

वास्तव में क्या आपकी आवश्यकता है: सबसे पहले गूगल मैच PHP कोड है? क्या आप 0 या अधिक वर्णों से मेल खाने के लिए '' प्रतीक का उपयोग करना चाहते हैं या आप '?' का उपयोग करने की योजना बना रहे हैं प्रतीक भी। यदि यह केवल '' है, तो आपको ए,, बी, बी * सी, आदि प्रकार पैटर्न देखने की आवश्यकता है? यदि आपकी आवश्यकता सीमित है, तो आप आसानी से सी ++ रनटाइम लाइब्रेरी के स्ट्रस्ट्र फ़ंक्शन से दूर हो सकते हैं।

5

सबसे आसान काम सिर्फ एक regex के लिए अपने ग्लोब पैटर्न कन्वर्ट करने के लिए, निम्नलिखित नियमों का होगा:

  • *.*
  • ? हो जाता है .
  • \|.^$+()[]{} का कोई भी उन्हें पूर्ववर्ती सहायता से निकले रहे हो जाता है \

यह आंशिक रूप से सच है।

के बाद नियम XP + कमांड प्रॉम्प्ट में DIR व्यवहार से शामिल किया जाता है:
**.* रूप में ही है और regex .+
? regex .? हो जाता है जब तक कि एक गैर वाइल्डकार्ड
? एक वाइल्डकार्ड के बाद नहीं द्वारा पीछा regex हो जाता हो जाता है .
*. "विस्तार के बिना" का अर्थ है, और [^.]+$

9

है PathMatchSpec हो जाता है - लेकिन हैंडलिंग फ़ाइलों के लिए विशिष्ट है, इसलिए यदि आप सामान्य वाइल्डकार्ड मिलान की आवश्यकता हो तो परिणाम आप अपेक्षा नहीं कर सकते हैं।

अन्यथा, आपको संभवतः रेवेक्स के साथ जाना चाहिए, जैसा कि पावेल विस्तृत है।

[संपादित करें] मैं गलत तरीके सेPathMatchSpec शेयरों FindFirstFile/FindNextFile के गुणों ग्रहण । मैंने कुछ परीक्षण चलाए हैं - ऐसा नहीं है। तो यह सबसे अच्छा उम्मीदवार की तरह दिखता है।

+0

एक बहुत ही रोचक खोज। मुझे आश्चर्य है कि यह चीज़ पथ के लिए कैसे विशिष्ट है, हालांकि (यदि यह वास्तव में है)। –

+0

पावेल, मैंने चेक किया - विशेष हैंडलिंग केवल FindFirst/NextFile में है। वाह! : डी – peterchen

+0

विशेष हैंडलिंग क्या है? मुझे नहीं लगता कि यह वही क्यों नहीं होगा? आपका मतलब है कि यह केवल फाइलफ़ास्ट/नेक्स्टफाइल में फ़ाइल नाम भाग पर लागू होता है? – paulm

3

आप एक सरल वाइल्डकार्ड के बाद कर रहे हैं की तुलना (globbing), कुछ लोगों को अपने स्वयं के लिखा है this one (जो हम अपने कोड में उपयोग)

6

अजीब है कि इतने सारे साल बीत गए और कोई भी आप इस जवाब दिया सहित, :

एक WIN32 एपीआई है जो वास्तव में आप जो खोज रहे हैं वह करता है। (मैंने इसे "वाइल्डकार्ड" के लिए एमएसडीएन में खोजा पाया)

इसका नाम SymMatchString() है। यह DbgHelp.dll में बैठता है जो ऑपरेटिंग सिस्टम का हिस्सा है।

यदि आपका ऐप मल्टीथ्रेड किया गया है तो एपीआई कॉल के चारों ओर एक क्रिटिकलसेक्शन डालें!

http://msdn.microsoft.com/en-us/library/windows/desktop/ms681355%28v=vs.85%29.aspx

एपीआई कि FindFirstFile() वाइल्डकार्ड के लिए आंतरिक रूप से चलने वाले मैच शायद FsRtlIsNameInExpression() है।

Elmü

+0

डीबीजीहेल्प ऑपरेटिंग सिस्टम का हिस्सा हो सकता है। दुर्भाग्यवश, एमएस ने यह कहने के लिए कहा है: "हालांकि यह डीएलएल विंडोज के सभी समर्थित संस्करणों में शामिल है, लेकिन यह शायद ही कभी डीबीएचहेल्प उपलब्ध का सबसे वर्तमान संस्करण है। इसके अलावा, विंडोज़ में जहाजों के डीबीजीहेल्प के संस्करण ने अन्य रिलीज से कार्यक्षमता कम कर दी है - विशेष रूप से, इसमें सिंबल सर्वर और स्रोत सर्वर के लिए समर्थन की कमी है। "व्यक्तिगत रूप से, मैं इस तरह के परिस्थितियों में इस एपीआई का उपयोग करके समाधान को तैनात करने में विशेष रूप से आरामदायक महसूस नहीं करता। –

+0

सिंबलसेवर या सोर्ससेवर पर कितने एप्लिकेशन चलाना है? यदि आप वास्तव में इस बारे में चिंता करते हैं कि आप अपने प्रोग्राम के फ़ोल्डर में DbgHelp.dll का एक ज्ञात संस्करण स्थापित कर सकते हैं और यह ओएस के डीएलएल के बजाय लोड किया जाएगा। – Elmue

संबंधित मुद्दे