93056


以下のような条件があるとして、マッチしたカッコの中身を配列に入れたいです。  
PowerShellでどのように実現したらいいでしょうか？

**条件:**

[code]

    $data = "{ab},{cd},{ef}・・・・" # この長さは固定ではなく可変
    $regex = '{(.+?)}'
    
[/code]

**期待する結果:**

[code]

    $array[0] = "ab" 
    $array[1] = "bc" 
    $array[2] = "ef" 
    
[/code]

※備考  
PowerShellだと配列に入れるというような考え方は無いのかもしれませんが、  
昔、Perlでこういうものは配列に入れたほうが後で処理しやすかったので、  
PowerShellでも実現したいのです。


CC BY-SA 4.0
2022-12-28T00:49:18.077
93055
2022-12-28T20:40:29.700
2022-12-28T01:40:56.540
3060
56253
question
正規表現 powershell
PowerShellで正規表現にマッチしたすべての箇所を配列に入れたい


`[regex]::Matches`を使うことで、マッチ結果をコレクション(≒配列)として取得できます。

**サンプルコード**

[code]

    $data = "{ab},{cd},{ef}・・・・" #この長さは固定ではなく、可変です。
    $regex = '{(.+?)}'
    
    $ms = [regex]::Matches($data, $regex)   # この時点でマッチがコレクションとして取得できる
    $array = ($ms | %{$_.Groups[1].Value})  # ()内の文字列をグループの値としてコレクション化して $array 変数に入れる
    $array                                  # 表示
    
[/code]


CC BY-SA 4.0
2022-12-28T01:14:06.223
93056
2022-12-28T01:45:52.120
2022-12-28T01:45:52.120
9820
9820
93055
answer


基本的にはpayanecoさんの回答通りなのですが、正規表現をもう少し工夫すると、PowerShell側から簡単にアクセスできるようになります。

[code]

    $data = "{ab},{cd},{ef}・・・・" #この長さは固定ではなく、可変です。
    $regex = '(?<={).+?(?=})'
    
    $ms = [regex]::Matches($data, $regex)   # この時点でマッチがコレクションとして取得できる
    $ms.Value                               # 表示
    
[/code]

これは、[メンバーアクセス演算子](https://learn.microsoft.com/ja-
jp/powershell/module/microsoft.powershell.core/about/about_member-
access_enumeration?view=powershell-7.3)といって、存在しないメンバーにアクセスした際、自動的に各要素のメンバーにアクセスしてくれる機能です。  
つまり、`$ms`は`[Regex]::Matches()`の戻り値である`MatchCollection`であり、`$ms.Value`は`MatchCollection`に`Value`プロパティが存在しないため、`$ms
| ForEach-Object { $_.Value }` として機能します。

（payanecoさんの回答では、`.Groups`まではこの機能が使えますが、`[1]`の時点で存在するメンバーとなってしまい、2番目の要素が取得されてしまいます。このため、`.Value`でアクセスできるように正規表現を工夫する必要がありました。）

* * *

> 配列にどのように格納したらよいでしょうか？

`$ms.Value.GetType()`を実行すれば

[code]

    PS> $ms.Value.GetType()
    
    IsPublic IsSerial Name                                     BaseType
    -------- -------- ----                                     --------
    True     True     Object[]                                 System.Array
    
[/code]

と得られるように、`$ms.Value`が既に配列です。格納したい場所に代入してください。


CC BY-SA 4.0
2022-12-28T02:19:44.097
93057
2022-12-28T20:40:29.700
2022-12-28T20:40:29.700
4236
4236
93055
answer