2010-02-27 12 views
6

मुझे यह जानने की ज़रूरत है कि -replace ऑपरेटर या Replace() विधि का उपयोग करते समय पावरहेल द्वारा कितने प्रतिस्थापन किए जाते हैं। या, यदि यह संभव नहीं है, तो अगर उसने कोई प्रतिस्थापन किया है।पावरहेल, आपने कितने प्रतिस्थापन किए हैं?

उदाहरण के लिए, पर्ल में, क्योंकि प्रतिस्थापन आपरेशन किए गए प्रतिस्थापन की संख्या देता है, और शून्य गलत है, जबकि गैर शून्य एक बूलियन संदर्भ में सच है, एक लिख सकते हैं:

$greeting = "Hello, Earthlings"; 
if ($greeting ~= s/Earthlings/Martians/) { print "Mars greeting ready." } 

हालांकि Powershell के साथ ऑपरेटर और विधि नई स्ट्रिंग वापस। ऐसा प्रतीत होता है कि ऑपरेटर कुछ अतिरिक्त जानकारी प्रदान करता है, अगर कोई जानता है कि इसके लिए कैसे पूछना है (उदाहरण के लिए, कैप्चर किए गए समूह एक नए चर में संग्रहीत होते हैं जो वर्तमान दायरे में बनाता है), लेकिन मुझे पता नहीं चल सकता कि गिनती कैसे प्राप्त करें या सफलता मूल्य

मैं मूल्यों के पहले और बाद में तुलना कर सकता हूं, लेकिन यह पूरी तरह से अक्षम है।

उत्तर

8

आप सही हैं, मुझे नहीं लगता कि आप जगह से बाहर कुछ भी निचोड़ सकते हैं। हालांकि, आप Regex.Matches() का उपयोग कर मिलानों की संख्या पा सकते हैं। उदाहरण के लिए

> $greeting = "Hello, Earthlings" 
> $needle = "l" 
> $([regex]::matches($greeting, $needle)).Length # cast explicitly to an array 
3 

तब आप -रेस्थल ऑपरेटर का उपयोग कर सकते हैं जो एक ही मिलान इंजन का उपयोग करता है।


एक छोटे से गहरी देखने के बाद, वहाँ जो एक MatchEvaluator प्रतिनिधि जो हर बार मिलान होने पर कहा जाता है लेता बदलें की एक अधिभार है। इसलिए, यदि हम इसे एक संचयक के रूप में उपयोग करते हैं, तो यह एक ही समय में प्रतिस्थापन की संख्या को गिन सकता है।

> $count = 0 
> $matchEvaluator = [System.Text.RegularExpressions.MatchEvaluator]{$count ++} 
> [regex]::Replace("Hello, Earthlings","l",$matchEvaluator) 
> $count 
Heo, Earthings 
3 
+0

महान समाधान! –

+0

यह मेरे लिए पीएस 3/विंडोज 8 पर काम नहीं करता है। प्रतिस्थापन काम करता है, लेकिन $ गिनती 0 है। हालांकि, जब मैं पीएस 2 इम्यूलेशन (पावरहेल-वर्जन 2 के माध्यम से) में चलता हूं तो यह काम करता है। – bart

+2

मुझे पता चला कि यह विंडोज प्रबंधन फ्रेमवर्क 3 रिलीज नोट्स में प्रलेखित परिवर्तन की वजह से है: "स्क्रिप्ट ब्लॉक अपने स्वयं के दायरे में चलाए गए प्रतिनिधियों के रूप में निष्पादित"। $ गिनती वैश्विक बनाने से समस्या हल हो जाती है। – bart

0

स्क्रिप्ट का संस्करण है कि वास्तव में चीजों की जगह है और उन्हें रिक्त नहीं:

$greeting = "Hello, earthlings. Mars greeting ready" 
$counter = 0 
$search = '\s' 
$replace = '' 
$evaluator = [System.Text.RegularExpressions.MatchEvaluator] { 
    param($found) 
    $counter++ 
    Write-Output ([regex]::Replace($found, [regex] $search, $replace)) 
} 

[regex]::Replace($greeting, [regex] $search, $evaluator); 
$counter 

->

> Hello,earthlings.Marsgreetingready 
> 4 
संबंधित मुद्दे