Regular Expression(正規表現) Part17

1デフォルトの名無しさん
垢版 |
2023/12/16(土) 08:59:20.50ID:uVHZ7e2j
Regular Expressionスレです。

質問する場合は必ず実装言語や処理系ソフトウェア名を示してください。

前スレ
Regular Expression(正規表現) Part16
https://mevius.5ch.net/test/read.cgi/tech/1635936601/

次スレは>>980宜しく
テンプレ>>2以降
2025/12/08(月) 21:08:56.84ID:Uac8TKoK
2007年08月13日 の投稿に/kを確認
https://sakura-editor.github.io/bbslog/sf/ansi/4937.html#4960

>正規表現キーワード /\b([0-9A-F]{2})+(?=h)?/k

bregonig.dllを導入するときに/kが必要になった可能性もあるのか
しかしこれ以上調べる気にはなれなかった
2025/12/08(月) 21:53:56.42ID:PdAyBLn5
面白いわくわくする
2025/12/12(金) 00:35:57.86ID:qdqoL0/s
よろしくお願いします

●Regular Expressionの使用環境
 サクラエディタ32bit Ver2.4.2.6048(bregoing.dll Ver.4.20 with Onigmo 6.2.0)

●検索か置換か?
 検索

●説明
 いかのアドレス範囲に一致させたい

●対象データ
151.145.0.0〜151.145.127.255
318317
垢版 |
2025/12/12(金) 00:48:13.98ID:qdqoL0/s
これで合ってますか?
(?:25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)){3}
319317
垢版 |
2025/12/12(金) 00:51:57.92ID:qdqoL0/s
間違えました

これで合ってますか?
(?:25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)){3}
320317
垢版 |
2025/12/12(金) 00:52:53.14ID:qdqoL0/s
また間違えてました・・・すみません

これで合ってますか?
151.145.(0|[1-9][0-9]?|1(0|1)[0-9]|12[0-7]).(0|[1-9][0-9]?|1[0-9]{2}|2[0-4][0-9]|25[0-5])
2025/12/12(金) 01:16:30.11ID:9WR4PduZ
細かい部分は見てないけど
とりあえず区切りの.はエスケープしないといけない
2025/12/12(金) 01:18:48.94ID:/Lx6Nx9f
IPアドレスに正規表現を使うなとは言っちゃダメなんだよね
2025/12/12(金) 01:28:18.32ID:spFFJYjp
その心は?
2025/12/12(金) 01:54:49.45ID:9WR4PduZ
これ前後切らないと"151.145.127.256"が"151.145.127.25"で引っ掛かるな
10進数以外の表記が混ざってたら知らん

(?<!\d)(151\.145\.(([1-9]|1[01])?[0-9]|12[0-7])\.(([1-9]|1[0-9]|2[0-4])?[0-9]|25[0-5]))(?!\d)
2025/12/12(金) 02:17:39.16ID:VvvzoDh6
JSマクロで正規表現は文字列マッチまでにして
数値の評価はコードでやるのが素直ちゃうかな
2025/12/12(金) 03:07:41.77ID:I1NVdYVn
bregoing
327317
垢版 |
2025/12/12(金) 09:10:56.65ID:qdqoL0/s
>>324
ありがとうございました!
ログの抽出なので、.256は記録自体されないので大丈夫でした
助かりました
328317
垢版 |
2025/12/12(金) 09:21:33.13ID:qdqoL0/s
度々すみません
よろしくお願いします

●Regular Expressionの使用環境
 サクラエディタ32bit Ver2.4.2.6048(bregoing.dll Ver.4.20 with Onigmo 6.2.0)
●検索か置換か?
 検索
●説明
 1この数字(15080)だけ除外して、他の全ては一致させたい
●対象データ
 10000〜65535
●結果
 15080だけ除外したい
329317
垢版 |
2025/12/12(金) 09:38:11.84ID:qdqoL0/s
また頑張って考えてみたのですが合ってますか?

(6(0-4(0-9)(0-9)(0-9)|5(0-4(0-9)(0-9)|5(0-2(0-9)|(3)0-5))))
330317
垢版 |
2025/12/12(金) 09:41:37.19ID:qdqoL0/s
全然ダメでした・・・
331317
垢版 |
2025/12/12(金) 09:53:53.88ID:qdqoL0/s
訂正してみました
(1-5(08(1-9)|(1-9)(1-9)(1-9))|6(0-4(0-9)(0-9)(0-9)|5(0-4(0-9)(0-9)|5(0-2(0-9)|(3)0-5))))
2025/12/12(金) 10:50:58.26ID:LKIn+XBY
(?<!\d)(?!15080(?!\d))\d+
333317
垢版 |
2025/12/12(金) 12:06:38.03ID:qdqoL0/s
>>332
それだと9999なども一致していまいました・・・
一致させたいのは以下の通り15080を除く10000〜65535の数字です

●対象データ
 10000〜65535
●結果
 15080だけ除外したい
2025/12/12(金) 12:13:35.22ID:rpg4U98A
エディタで実行するってことは手作業が前提なのかな?
それなら検索に先立って 15080 を 💩 に置換しておく方が手っ取り早い
335デフォルトの名無しさん
垢版 |
2025/12/12(金) 12:54:36.94ID:5G5yyPjc
(?!15080)(5桁特定範囲マッチ文)
あとは任せた
2025/12/12(金) 14:08:50.61ID:GFwk6EHV
ログ抽出なら普通にgrepすればいいじゃん
除外したければgrep結果に-vで再grep
337317
垢版 |
2025/12/12(金) 19:24:53.03ID:qdqoL0/s
>>335
肝心な部分たのまい!
2025/12/12(金) 19:47:36.13ID:9WR4PduZ
(?!15080)([1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])

6桁以上を除外するなら
(?<!\d)((?!15080)([1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5]))(?!\d)
339317
垢版 |
2025/12/12(金) 19:49:17.82ID:qdqoL0/s
>>335
ありがとうございます
これで合ってますか?
(?!15080)(([1-5]([0-9])([0-9])([0-9])([0-9]))|(6([0-4]([0-9])([0-9])([0-9])|5([0-4]([0-9])([0-9])|5([0-2]([0-9])|(3)[0-5])))))
340317
垢版 |
2025/12/12(金) 19:50:24.52ID:qdqoL0/s
>>338
超ありがとうございます!
教えていただいたこちら使わせていただきます
助かりました
(?!15080)([1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])
341317
垢版 |
2025/12/12(金) 21:51:03.49ID:qdqoL0/s
>>334
スクリプト作るのがめんどくさくてサクラエディタのキーマクロで置換してたんですけど
つい先ほどWSH(JScript)で置換することにしました
💩速くなりました
2025/12/12(金) 22:25:23.79ID:lKBtIMua
すっきり快便
2025/12/13(土) 01:35:26.40ID:klNuhF9X
JScriptで検索自体を素直に書けるのに正規表現のみにこだわる必要がない
外部コマンドでタグジャンプ用の出力するのもあり
344デフォルトの名無しさん
垢版 |
2025/12/14(日) 10:09:57.70ID:+W6SCkp6
先読みアサーションって、(マッチさせたい文字列に対応する)本体パターンの後ろに書くものだと思っていたけど、340みたいに前に書くのも一般的なのかな?

(?!15080)([0-9]{5}) が15080にマッチしないのが先読みアサーションの意味論に照らして正しいのか個人的にちょっと自信が持てない(というか疑わしく思う)んだが。
戻り読みアサーションの(?<!15080)([0-9]{5})は15080にマッチするし、こちらの方が意味論どおりの動作のような気がするんだけど。
2025/12/14(日) 10:25:19.80ID:tGd21ggn
先読みは次に15080が出てこない条件下で後続の5桁の数字にマッチさせる形だから大丈夫そう

戻り読みだと手前に15080が出てこない条件下で後続の5桁の数字にマッチさせるから
1508015080でない限り後続の15080にマッチする
346デフォルトの名無しさん
垢版 |
2025/12/14(日) 10:32:54.84ID:4RDsvJB6
本体部分のパターンが [0-9]{5} なんだから、先読み・戻り読みのアサーション条件をクリアする限り、15080にもマッチするのが意味論どおりの動作ではないかということなんだが。
2025/12/14(日) 11:08:03.17ID:Pr7gBHpv
ここでグラフィカルに確認できる
https://www.debuggex.com/
2025/12/14(日) 11:12:12.21ID:C4yAKXLX
先読みは位置を動かさない
つまり、この場合「本体」部分にその文字列が無いのが条件となる
2025/12/14(日) 11:14:59.12ID:Pr7gBHpv
(?!15080)([0-9]{5})
1508015080は50801にマッチ
15079は15079にマッチ

(?<!15080)([0-9]{5})
1508015080は15080にマッチ ←ここ
15079は15079にマッチ
2025/12/14(日) 11:24:53.49ID:C4yAKXLX
よくある使い方
((?!abc).)+
abcでない文字列
2025/12/14(日) 11:28:30.93ID:C4yAKXLX
1文字の場合は [^a]+
これの複数文字パターンってこと
352デフォルトの名無しさん
垢版 |
2025/12/14(日) 11:47:42.73ID:4RDsvJB6
うーん、ちょっとアサーションについて誤解していたところがあったかも。考え直してみますわ。
2025/12/14(日) 12:38:24.68ID:C4yAKXLX
順序を逆にすると本体部分で位置が進むので
([a-z](?!abc))+
abcd → abcd ;先頭はabcだがaの後ろにはabcがないのでaにもマッチする
xabcd → abcd
[a-z]+(?!abc)なら
xabcd → xabcd ; [a-z]+でxabcdがマッチしその後ろにはabcが無いので
[a-z]+(?<!bcd)なら
abcd → abc ; abcdと進んでいくとbcdにマッチするので逆行してabcでストップする
レスを投稿する

5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況