Powershell Regular Expression Get String Between tags <div class="name"></a></div>タグの間の文字列を抽出する

# 文字列を取得

 1.まずF12で該当部分を探す
 2.次にコピーでinnerhtmlをコピーする
 3.PS_GetClpSpcial.Ps1でテキストファイルとして取得。これはこちらにあります。最後の試作品の項目のスクリプトです。[PowershellでClipBoardから画像、テキスト、HTMLを保存する各スクリプト2](https://qiita.com/Q11Q/items/1dae7d443adf05cd3f3a)ただHTMLではなくユニコードテキストになります。

# 正規表現
さてここでどうするか
抜き出したい文字列は<div class="name"></div>または<div class="name"></a></div>
しかしテキストファイルの中身は
```html
<div class="name">lalala</div>lalala<div class="name">lalala</div></div></div>
</div>lalala<p></p><div class="name">lalala</div>
<div class="name">lalala</div>name
```

と、このように複雑です。

`$filename="c:\hoge\hoge.txt"`
でファイル名を取得し `get-content`を使う
マッチ文字列が難しい。
```powershell
$ret =[regex]::Matches((Get-Content $fileName),"(<div\ class*\=.name.>.*?<\/a><\/div>\B | <div\ class*\=.name.>.*?<\/div>\B)");$ret.Count;$ret[0].Groups.Count
```
まず
```powershell
$ret =[regex]::Matches((Get-Content $fileName),"(<div\ class*\=.tweet.>.*?<\/a><\/div>\B | <div\ class*\=.tweet.>.*?<\/div>\B)");$ret.Count;$ret[0].Groups.Coun
#Replace 置換文字列
`$ret[0].value -replace("\<.*?\>","")`
```

```powershell
$strTest=@"
<div class="name">lalala</div>land<div class="name">lalala</div></div></div>
</div>lololo<p></p><div class="name">mamama</div>
<div class="name">nanana</a></div>name
"@
$ret=[regex]::Matches($strTest,"( ?\<div\ class*\=.name.>.*?<\/a><\/div> | ?\<div\ class*\=.name.>.*?<\/div>)");$ret.Count;$ret[0].Groups.Count
$ret[0].Value -replace("\<.*?\>","")

```

`get-content filename`の代わりに文字列を入れました。ヒア文字で代入すると改行も入り、ダブルクォーテーションも二重にしてエスケープしなくてよいです。

# 完成形
Dドライブにテキストとして出力するようにします

```powershell:PS_GetBetweenTagString.ps1
$folder="D:\"
$strTest=@"
<div class="name">lalala</div>land<div class="name">lalala</div></div></div>
</div>lololo<p></p><div class="name">mamama</div>
<div class="name">nanana</a></div>name
"@
$ret=[regex]::Matches($strTest,"( ?\<div\ class*\=.name.>.*?<\/a><\/div> | ?\<div\ class*\=.name.>.*?<\/div>)");$ret.Count;$ret[0].Groups.Count
$ret[0].Value -replace("\<.*?\>","")
if($ret.Count -gt 0 ){
$sFullPath = (Join-path $folder ((Get-Date -f s) -replace '[-T:]','')) ;
$sFullPath =$sFullPath + '.txt'
$ret | foreach{'Index:' + $_.index , 'Length: ' + $_.length , $_.value -replace("\<.*?\>","") | Out-File $sFullPath -Append -Encoding "utf8"}
}#if($ret.Count -gt 0 )
```

# 参考
[[正規表現] .*?は最短マッチではない](https://qiita.com/anqooqie/items/191ad215e93237c77811) という批判もあるが、Powershellなので、変換が難しい
RegularExpressions 101[https://regex101.com/r/5jAdih/4](https://regex101.com/r/5jAdih/4)もEcmaScriptが近いが、思った通りにはいかない。
[タブや改行を文字列値に含める方法](https://bayashita.com/p/entry/show/91)
[正規表現でHTMLタグを<a.*?</a>でマッチさせるのは間違っている](https://iwb.jp/javasctipt-html-regexp-match/)
gフラグがPowershellでは使えない
[[正規表現]divに囲まれた文字列を正規表現で選択したい](https://teratail.com/questions/47924)
もちろんパースできればこのような正規表現は不要だ。
[Returning the contents of a HTML div with Powershell](https://stackoverflow.com/questions/26465672/returning-the-contents-of-a-html-div-with-powershell)
これもきれいなファイルならできそう。
[PowerShell Regex get substring between 2 strings [duplicate]](https://stackoverflow.com/questions/46537255/powershell-regex-get-substring-between-2-strings)
正規表現については、これはちょっとヒントになった。特にGroupができる点。
[Javascriptの正規表現](https://yuzuemon.hatenablog.com/entry/20120211/1328892585)
Powershellでは改行には神経質にならなくてよいようだ。逆に開業を含めない場合は難しいが。
[PowerShellでスクレイピング 後編 HTMLをパースする](http://winscript.jp/m/powershell/304)