Regular Expression(正規表現) Part17at TECH
Regular Expression(正規表現) Part17 - 暇つぶし2ch476:デフォルトの名無しさん
26/05/24 19:20:21.82 avyHEBhm.net
プログラム言語用のハイライトは重くなりやすい
動作の軽い正規表現の作り方を知らない人が作ると重くなりやすい
アプリの評判にまで関わるからアプリ作者は重視すべき

477:デフォルトの名無しさん
26/06/05 07:39:23.44 l0w9Pe0T.net
Coreutils for Windowsに付属するgrepは正規表現ライブラリとしてpcre2ではなくOnigurumaを使ってるみたいだね
PowerShell上で grep -P -e "\p{sc:han}" aaa と入力実行したら、以下のエラー文字列が返ってきた

grep.cmd: invalid pattern "\p{sc:han}": Oniguruma error: invalid character property name {sc:han}

grepをRustで実装しなおしてるみたいだけど、「Known Issues」にも「Performances need to be improved」と書かれているとおり処理速度は遅い
巨大テキストファイルに対して"\p{han}"で漢字を探す速度テストをしたらCoreutilsのgrepはripgrepよりも5倍弱遅かった
ripgrepもRust使っているから改善の余地はまだまだありそう

以下は、Coreutilsと付属grepのgitレポジトリ

Coreutils for Windows
URLリンク(github.com)

Grep, now in Rust
URLリンク(github.com)

478:デフォルトの名無しさん
26/06/06 10:45:34.99 Oa2waA8Q.net
速度比較面白そうだけどwindows環境が無かった

479:デフォルトの名無しさん
26/06/06 12:50:17.39 avhJY7dK.net
>>477
ripgrepはデフォルトで並列処理だから速いのは当たり前
比較対象が間違ってる

480:デフォルトの名無しさん
26/06/06 13:47:10.13 A4Gfe8Wl.net
>>477
そのポート、Pオプションって指定してるのにPCRE(2)使ってないと互換性に問題が出るな

481:デフォルトの名無しさん
26/06/06 14:56:09.21 SQIW+QID.net
>>479
600MB超の単体ファイルでテストしただけからripgrepはわざわざ並列処理を使ってないはず
Coreutilsのgrepは"武田"などの固定文字列だとripgrepと同じくらい速かったから、
正規表現ライブラリの性能に大きく依存してそうな感じがする

482:デフォルトの名無しさん
26/06/06 15:31:09.58 A4Gfe8Wl.net
自分もregexエンジン律速だと思うけど
ioの差があるのか確かめたかったら
どちらも高速なripgrepとugrepでPオプションを付けて計測するかな

483:デフォルトの名無しさん
26/06/06 20:27:27.06 SQIW+QID.net
以下の日本語Wikipediaテキストbz2書庫を展開すると19725892117バイト、266676659行になる
URLリンク(dumps.wikimedia.org)

Coreutilsのwc -lコマンドでテキストファイルjawiki-pages-articles.xmlの行数を計算したところ、所要時間は約3.5秒となった
& 'C:\Program Files\coreutils\cmd\wc.cmd' -l 'jawiki-pages-articles.xml' -> 3.5457081s


以下のようにPowerShellでコマンド引数を$paramsで渡すものとした。
$params=('-ic', '-e', '^', 'jawiki-pages-articles.xml');

windows git版grep, chocolatey版rg, chocolatey版ugrep, pcre2をMSVC2026でビルドしたpcre2grepでそれぞれ計測した。
各実行バイナリの所要時間は以下の通り。
& 'C:\Program Files\coreutils\cmd\grep.cmd' -a -P @params -> 31.2892649s
&"C:\Program Files\Git\usr\bin\grep.exe" -a -P @params -> 16.4189897s
rg -a --no-heading -N -P @params -> 16.7601986s
ugrep -a -P @params -> 8.3243997s
pcre2grep -U @params -> 14.1089445s

評価
・chocolatey版ugrepがかなり速く、シンプルなwc -lコマンドの約3.5秒に対してugrepが8.3秒でかなり健闘している。
・PCRE2を使うwindows git版grep, chocolatey版rgがいずれも16秒台で、pcre2grepの14秒より少し遅いが近いオーダー。
・CoreutilsのgrepはPCRE2を使う実行バイナリよりも2倍近く遅い。

484:483
26/06/06 20:44:56.15 SQIW+QID.net
なお、PowerShellには既定で見やすい計時コマンドがないので以下に、独自timeコマンドを用意した

function time($block) {
$sw = [Diagnostics.Stopwatch]::StartNew()
& $block
$sw.Stop()
Write-Host("$($PSStyle.Italic)$($PSStyle.Foreground.Yellow){0,-24}$($PSStyle.ItalicOff)$($PSStyle.Foreground.BrightGreen)`t{1}$($PSStyle.Foreground.Cyan)s$($PSStyle.Reset)" -f $block, $($sw.Elapsed.TotalSeconds))
}

timeコマンドの実行例は以下の通り
> time { grep -acPi '武田' .\jawiki-pages-articles.xml }

実行結果例は以下の通り。

62447
& 'C:\Program Files\coreutils\cmd\grep.cmd' -acPi '"武田"' .\jawiki-pages-articles.xml 19.7067166s

ここでは62447行が"武田"にヒットし、所要時間は21秒ほど。上述の"^"での31秒より速いのが謎。
余談ながら、grepがC:\Program Files\coreutils\cmd\grep.cmdに展開される理由はよくわからないが、PowerShellのユーザー設定ファイルがCoreutilsインストール時に改変された影響と思われる。

485:483
26/06/06 20:50:36.45 SQIW+QID.net
訂正。"武田"を検索する所要時間は21秒ほどではなく19秒ほど。なんどかやってみたが2秒程度の誤差は普通に出るっぽい。
使ったCPUは、Intel Core Ultra 7 265K。

486:デフォルトの名無しさん
26/06/06 22:52:21.77 Oa2waA8Q.net
マッチする回数が多いと遅くなると仮定すると"武田"より"鈴木"は遅くなるはず

487:デフォルトの名無しさん
26/06/08 07:00:19.15 iZR3lOJN.net
正規表現ゴリ押し部
URLリンク(wbsb.dev)

488:デフォルトの名無しさん
26/06/14 09:22:30.28 CULM30OO.net
ugrepはギガサイズの潤沢なメモリを使える今時のPCに最適化されてて良いね
巨大単体ファイルを検索するとugrepがripgrepよりも2倍以上速いのは、単体ファイル検索までもがマルチスレッド化されているからだろう

489:デフォルトの名無しさん
26/06/18 14:21:37.36 2N0+Im+D.net
●Regular Expressionの使用環境
JavaScript
※実際はbregonig.dll Ver.4.20 with Onigmo 6.2.0ですが、
 極力、高度な正規表現は使わない表現で検索したいです

●検索か置換か?
検索

●説明
5chの縦書きに一致する正規表現を知りたい

●対象データ
URL先のResult:欄を参照
専ブラJaneXenoで取得した5ch.ioのdatデータ(2レス分)です

●希望する結果
URL先の1行目と2行目の「本文部分」に一致するようにしたいです
本文が数値参照の場合も一致させたいです
※本文部分はID:*<>の次の半角空白から行末の半角空白<>までです

●ググって自分で出来た部分
URLリンク(www.debuggex.com)

よろしくお願いします

490:489
26/06/18 14:26:31.61 2N0+Im+D.net
すみません、補足です

●希望の補足
前後途中の全角半角空白は無視して1行に1文字(数値参照含む)の行が3回以上繰り返された場合を検索したいです

●こういうのを検索したいです

 い
  う
   え
  お 

491:デフォルトの名無しさん
26/06/18 14:40:44.72 OZ+7dDz1.net
正規表現は数値参照を一文字として認識できないので、プログラミング言語を使うべき

492:デフォルトの名無しさん
26/06/18 22:25:22.95 jDQmweOk.net
>>489
(?:<> |<br>)(?:[  ]*(?:&#[0-9]+;|[^  <])[  ]*(?:<br>|<>$)){3}
許されるなら(?:は(?>に、*は*+にした方が良いと思う

493:489
26/06/18 22:51:03.50 2N0+Im+D.net
>>492
早速回答していただきどうもありがとうございました
おかげさまで無事に検索(NG)にできるようになりました
非常に困っていたのでとても助かりました
ありがとうございました

494:デフォルトの名無しさん
26/06/19 02:35:52.34 VhMHdvhg.net
なるほど

495:デフォルトの名無しさん
26/06/19 05:01:50.30 FA6Zk3fx.net
dat(対象データ)の本文部分にマッチとdatの本文部分(対象データ)にマッチじゃ意味が違うだろう

496:489
26/06/19 11:01:20.75 mUdQS15D.net
>>492
度々すみません。
1文字に一致という部分の正規表現はどこが該当しているのでしょうか?


最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch