"This is **bold** and this is also **BOLD**,finally this is also **Bold**" -match '\*\*.*?\*\*'
Finds only the first match
$Matches.count
Returns only 1
Doing the same thing with -Replace Finds all matches in the string:
"This is **bold** and this is also **BOLD**,finally this is also **Bold**" -replace '\*\*.*?\*\*', 'Substring'
It matches and replaces all instances:
This is Substring and this is also Substring,finally this is also Substring
How do I get the -Match operator to find all matches and return them as arrays belonging to the $Matches variable?
Thanks!
CodePudding user response:
The
-matchoperator indeed only finds at most one match in its input, invariably and by design, whereas-replaceinvariably finds and replaces all matches.As of PowerShell 7.2.x, you need to use the underlying .NET APIs directly in order to find multiple matches, namely the
[regex]::Matches()method.- GitHub issue #7867 proposes introducing a
-matchalloperator to provide a PowerShell-native implementation - while the proposal has been green-lit, no one has stepped up to implement it yet.
- GitHub issue #7867 proposes introducing a
[regex]::Matches(
'This is **bold** and this is also **BOLD**,finally this is also **Bold**',
'\*\*.*?\*\*'
).Value
Note that [regex]::Matches() returns a collection of [System.Text.RegularExpressions.Match] instances, whose .Value property contains the matched text.
