PowerShell
नियमित अभिव्यक्ति
खोज…
वाक्य - विन्यास
- 'पाठ' -मैच '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)
सिलेक्ट-स्ट्रिंग का उपयोग करना
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)