PowerShell और -contains ऑपरेटर


143

निम्नलिखित स्निपेट पर विचार करें:

"12-18" -Contains "-"

आपको लगता है कि यह मूल्यांकन करता है true, लेकिन ऐसा नहीं है। इसके falseबदले मूल्यांकन करेंगे । मुझे यकीन नहीं है कि ऐसा क्यों होता है, लेकिन यह होता है।

इससे बचने के लिए, आप इसके बजाय इसका उपयोग कर सकते हैं:

"12-18".Contains("-")

अब अभिव्यक्ति सत्य का मूल्यांकन करेगी।

पहला कोड स्निपेट ऐसा क्यों करता है? वहाँ के बारे में कुछ खास है -कि अच्छी तरह से नहीं खेलता है -Contains? प्रलेखन इसके बारे में कुछ उल्लेख नहीं है।

जवाबों:


196

-Containsऑपरेटर तुलना सबस्ट्रिंग करना नहीं है और मैच एक पूरी स्ट्रिंग पर होनी चाहिए और संग्रह खोज करने के लिए प्रयोग किया जाता है।

आपके द्वारा लिंक किए गए दस्तावेज़ से:

-संचालन विवरण: कंटेनर ऑपरेटर। बताता है कि क्या संदर्भ मूल्यों के संग्रह में एकल परीक्षण मूल्य शामिल है।

आपके द्वारा प्रदान किए गए उदाहरण में आप केवल एक स्ट्रिंग आइटम वाले संग्रह के साथ काम कर रहे हैं।

यदि आप अपने द्वारा जुड़े दस्तावेज़ पढ़ते हैं, तो आपको एक उदाहरण दिखाई देगा जो इस व्यवहार को प्रदर्शित करता है:

उदाहरण:

PS C:\> "abc", "def" -Contains "def"
True

PS C:\> "Windows", "PowerShell" -Contains "Shell"
False  #Not an exact match

मुझे लगता है कि आप जो चाहते हैं वह -Matchऑपरेटर है:

"12-18" -Match "-"

जो लौटता है True

महत्वपूर्ण: जैसा कि टिप्पणियों में और लिंक किए गए दस्तावेज़ीकरण में बताया गया है , यह ध्यान दिया जाना चाहिए कि -Matchऑपरेटर पाठ मिलान करने के लिए नियमित अभिव्यक्ति का उपयोग करता है ।


14
पूर्णता के लिए, जबकि -मैच एक अच्छा मैच हो सकता है जो रेगेक्स का उपयोग करता है। यदि किसी को एक अस्पष्ट स्ट्रिंग की जांच करनी है, तो एक को ओपी का वर्णन करना चाहिए:"12-18".Contains("-")
8DH

4
@ 8DH - बहुत अच्छी पकड़ :)। प्रश्न को फिर से पढ़ने के बाद मुझे लगता है कि मुझे Containsपॉवरशेल ऑपरेटर और .Contains() .NET String विधि के बीच अंतर को स्पष्ट करने की आवश्यकता है ।
केव

1
जैसा कि ऊपर टिप्पणी में पहले ही उल्लेख किया गया है, -Matchरेगेक्स का उपयोग करता है। इसका मतलब है कि स्ट्रिंग पैरामीटर एक रेगेक्स है, न कि सामान्य स्ट्रिंग। उदाहरण के लिए, "hello" -Match "."सच लौटेगा, क्योंकि "."एक रेगीक्स है जहां '।' किसी भी पात्र से मेल खाएगा। यह जांचने के लिए कि क्या एक स्ट्रिंग में पूर्ण विराम है: "hello" -Match "\."(गलत रिटर्न करता है)
मॉल

1
@ मल्ला - अच्छा बिंदु, मैंने इस बारे में एक नोट में संपादित किया है। धन्यवाद।
केव

यह निश्चित रूप से एक "झूठा दोस्त" है! :) "-contains" का अर्थ "एक सूची से संबंधित" है।
राउल सालिनास-मोंटेगुडो

38

-Containsवास्तव में एक संग्रह ऑपरेटर है। यह सच है अगर संग्रह में ऑब्जेक्ट शामिल है। यह तार तक सीमित नहीं है।

-matchऔर-imatch नियमित अभिव्यक्ति स्ट्रिंग मिलानकर्ता हैं, और कैप्चर के साथ उपयोग करने के लिए स्वचालित चर सेट करते हैं।

-like, -ilikeSQL- जैसे मिलानकर्ता हैं।


13

आप उपयोग कर सकते हैं like:

"12-18" -like "*-*"

या इसके splitलिए contains:

"12-18" -split "" -contains "-"

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.