खोज…


वाक्य - विन्यास

  • 'पाठ' -मैच 'RegExPattern'
  • 'टेक्स्ट' -replace 'RegExPattern', 'newvalue'
  • [regex] :: मिलान ("पाठ", "पैटर्न") # एकल मिलान
  • [regex] :: माचिस ("टेक्स्ट", "पैटर्न") #Multiple मैच
  • [Regex] :: (, "पाठ", "पैटर्न" "NEWVALUE") बदलें
  • [regex] :: बदलें ("पाठ", "पैटर्न", {परम) ($ m)}) # बैचवर्क
  • [regex] :: एस्केप ("इनपुट") #Escape विशेष वर्ण

एकल मैच

यदि कोई पाठ Regex का उपयोग करके एक विशिष्ट पैटर्न शामिल करता है, तो आप जल्दी से निर्धारित कर सकते हैं। PowerShell में Regex के साथ काम करने के कई तरीके हैं।

#Sample text
$text = @"
This is (a) sample
text, this is
a (sample text)
"@

#Sample pattern: Content wrapped in ()
$pattern = '\(.*?\)'

-Match ऑपरेटर का उपयोग करना

यह निर्धारित करने के लिए कि कोई स्ट्रिंग अंतर्निहित -matches ऑपरेटर का उपयोग करके एक पैटर्न से मेल खाती है, सिंटैक्स 'input' -match 'pattern' । यह खोज के परिणाम के आधार पर true या false लौटेगा। अगर वहाँ मैच था तो आप मैच और समूहों (यदि पैटर्न में परिभाषित किया गया है) को $Matches परिवर्तनीय तक पहुँच कर देख सकते हैं।

> $text -match $pattern
True

> $Matches

Name Value
---- -----
0    (a)  

आप स्ट्रिंग के एक सरणी के माध्यम से फ़िल्टर करने के लिए -match का भी उपयोग कर सकते हैं और केवल एक मैच वाले तारों को वापस कर सकते हैं।

> $textarray = @"
This is (a) sample
text, this is
a (sample text)
"@ -split "`n"

> $textarray -match $pattern
This is (a) sample
a (sample text)
2.0

सिलेक्ट-स्ट्रिंग का उपयोग करना

PowerShell 2.0 ने regex का उपयोग करके पाठ के माध्यम से खोज करने के लिए एक नया cmdlet पेश किया। यह एक MatchInfo प्रति MatchInfo ऑब्जेक्ट देता है जिसमें एक मैच होता है। आप मिलान समूहों आदि को खोजने के लिए इसके गुणों का उपयोग कर सकते हैं।

> $m = Select-String -InputObject $text -Pattern $pattern

> $m

This is (a) sample
text, this is
a (sample text)

> $m | Format-List *

IgnoreCase : True
LineNumber : 1
Line       : This is (a) sample
             text, this is
             a (sample text)
Filename   : InputStream
Path       : InputStream
Pattern    : \(.*?\)
Context    : 
Matches    : {(a)}

जैसे -match , Select-String को एक ऐरे से पाइपिंग करके स्ट्रिंग्स की एक सरणी के माध्यम से फ़िल्टर करने के लिए भी इस्तेमाल किया जा सकता है। यह एक MatchInfo एक MatchInfo -ओबजेक्ट बनाता है जिसमें एक मैच शामिल है।

> $textarray | Select-String -Pattern $pattern

This is (a) sample
a (sample text)

#You can also access the matches, groups etc.
> $textarray | Select-String -Pattern $pattern | fl *


IgnoreCase : True
LineNumber : 1
Line       : This is (a) sample
Filename   : InputStream
Path       : InputStream
Pattern    : \(.*?\)
Context    : 
Matches    : {(a)}

IgnoreCase : True
LineNumber : 3
Line       : a (sample text)
Filename   : InputStream
Path       : InputStream
Pattern    : \(.*?\)
Context    : 
Matches    : {(sample text)}

Select-String -SimpleMatch स्विच को जोड़कर एक सामान्य टेक्स्ट-पैटर्न (कोई रेगेक्स) का उपयोग करके भी खोज कर सकता है।

[RegEx] :: मिलान () का उपयोग करना

आप .NET [RegEx] -class में उपलब्ध स्थिर Match() विधि का भी उपयोग कर सकते हैं।

> [regex]::Match($text,$pattern)

Groups   : {(a)}
Success  : True
Captures : {(a)}
Index    : 8
Length   : 3
Value    : (a)

> [regex]::Match($text,$pattern) | Select-Object -ExpandProperty Value
(a)

बदलने के

रेगेक्स के लिए एक सामान्य कार्य पाठ को बदलना है जो एक नए मूल्य के साथ एक पैटर्न से मेल खाता है।

#Sample text
$text = @"
This is (a) sample
text, this is
a (sample text)
"@

#Sample pattern: Text wrapped in ()
$pattern = '\(.*?\)'

#Replace matches with:
$newvalue = 'test'

का उपयोग कर -Replace ऑपरेटर

PowerShell में -replace ऑपरेटर का उपयोग वाक्यविन्यास 'input' -replace 'pattern', 'newvalue' का उपयोग करके नए पैटर्न के साथ एक पैटर्न से मेल खाते टेक्स्ट को बदलने के लिए किया जा सकता है।

> $text -replace $pattern, $newvalue
This is test sample
text, this is
a test

[RegEx] :: प्रतिस्थापन () विधि का उपयोग करना

[RegEx] .NET क्लास में Replace() पद्धति का उपयोग करके मैच की जगह भी ली जा सकती है।

[regex]::Replace($text, $pattern, 'test')
This is test sample
text, this is
a test

माचिसवल्टर का उपयोग करके पाठ को डायनेमिक मान से बदलें

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

PowerShell में, एक MatchEvaluator एक एकल paramter के साथ एक स्क्रिप्टब्लॉक के रूप में सरल है जिसमें वर्तमान मैच के लिए एक Match आधारित है। कार्रवाई का आउटपुट उस विशिष्ट मैच के लिए नया मूल्य होगा। MatchEvalutor [Regex]::Replace() स्थिर विधि के साथ इस्तेमाल किया जा सकता है।

उदाहरण : पाठ की जगह () लंबाई के साथ

#Sample text
$text = @"
This is (a) sample
text, this is
a (sample text)
"@
    
#Sample pattern: Content wrapped in ()
$pattern = '(?<=\().*?(?=\))'

$MatchEvalutor = {
    param($match)

    #Replace content with length of content
    $match.Value.Length

}

आउटपुट:

> [regex]::Replace($text, $pattern, $MatchEvalutor)

This is 1 sample
text, this is
a 11

उदाहरण: sample ऊपरी-केस बनाएं

#Sample pattern: "Sample"
$pattern = 'sample'

$MatchEvalutor = {
    param($match)

    #Return match in upper-case
    $match.Value.ToUpper()

}

आउटपुट:

> [regex]::Replace($text, $pattern, $MatchEvalutor)

This is (a) SAMPLE
text, this is
a (SAMPLE text)

विशेष वर्ण से बचो

एक रेगेक्स-पैटर्न एक पैटर्न का वर्णन करने के लिए कई विशेष वर्णों का उपयोग करता है। उदा।, . का अर्थ है "कोई भी वर्ण", + "एक या अधिक" आदि है।

इन पात्रों का उपयोग करने के लिए, एक के रूप में . , + आदि, एक पैटर्न में, आपको उनका विशेष अर्थ निकालने के लिए उनसे बचने की आवश्यकता है। यह पलायन चरित्र का उपयोग करके किया जाता है जो कि रेक्स में एक बैकस्लैश \ _ है। उदाहरण: + खोज करने के लिए, आप पैटर्न \+ उपयोग करेंगे।

रेगेक्स में सभी विशेष पात्रों को याद रखना कठिन हो सकता है, इसलिए प्रत्येक विशेष चरित्र से बचने के लिए एक स्ट्रिंग में जिसे आप खोजना चाहते हैं, आप [RegEx]::Escape("input") विधि का उपयोग कर सकते हैं।

> [regex]::Escape("(foo)")
\(foo\)

> [regex]::Escape("1+1.2=2.2")
1\+1\.2=2\.2

कई मैच

एक पाठ में एक पैटर्न के लिए सभी मैच खोजने के कई तरीके हैं।

#Sample text
$text = @"
This is (a) sample
text, this is
a (sample text)
"@

#Sample pattern: Content wrapped in ()
$pattern = '\(.*?\)'

सिलेक्ट-स्ट्रिंग का उपयोग करना

आप सभी मिलान (वैश्विक मैच) को -AllMatches Select-String में -AllMatches स्विच जोड़कर पा सकते हैं।

> $m = Select-String -InputObject $text -Pattern $pattern -AllMatches

> $m | Format-List *

IgnoreCase : True
LineNumber : 1
Line       : This is (a) sample
             text, this is
             a (sample text)
Filename   : InputStream
Path       : InputStream
Pattern    : \(.*?\)
Context    : 
Matches    : {(a), (sample text)}

#List all matches
> $m.Matches

Groups   : {(a)}
Success  : True
Captures : {(a)}
Index    : 8
Length   : 3
Value    : (a)

Groups   : {(sample text)}
Success  : True
Captures : {(sample text)}
Index    : 37
Length   : 13
Value    : (sample text)

#Get matched text
> $m.Matches | Select-Object -ExpandProperty Value
(a)
(sample text)

[RegEx] :: माचिस () का उपयोग करना

.NET `[regex] -class में Matches() विधि का उपयोग कई मैचों के लिए वैश्विक खोज करने के लिए भी किया जा सकता है।

> [regex]::Matches($text,$pattern)

Groups   : {(a)}
Success  : True
Captures : {(a)}
Index    : 8
Length   : 3
Value    : (a)

Groups   : {(sample text)}
Success  : True
Captures : {(sample text)}
Index    : 37
Length   : 13
Value    : (sample text)

> [regex]::Matches($text,$pattern) | Select-Object -ExpandProperty Value

(a)
(sample text)


Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow