X



Regular Expression(正規表現) Part14 [無断転載禁止]©2ch.net
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
垢版 |
2017/03/15(水) 02:04:35.47ID:e01p03UP
Regular Expressionスレです。

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

前スレ
Regular Expression(正規表現) Part13
http://echo.2ch.net/test/read.cgi/tech/1415149975/


次スレは>>980宜しく
天ぷら等2以降
0002デフォルトの名無しさん
垢版 |
2017/03/15(水) 02:06:40.55ID:ko4BTSP2
スルーされにくい質問のテンプレと例

●Regular Expressionの使用環境
Java1.5

●検索か置換か?
検索

●説明
各行の1番目のAまでを検索したい

●対象データ
ABCA
BCAA
CABA

●希望する結果
ABCA
^
BCAA
^^^
CABA
^^

※ ^ はアンダーラインだそうな ^^;
0003デフォルトの名無しさん
垢版 |
2017/03/15(水) 02:06:57.31ID:ko4BTSP2
◆関連サイト
正規表現メモ
http://www.kt.rim.or.jp/~kbk/regex/regex.html
Perl正規表現雑技
http://www.din.or.jp/~ohzaki/regex.htm
Regular Expression(Riue ちゃんの正規表現講座)
http://www.sixnine.net/regexp/
正規表現パズル
http://www.geocities.jp/oraclesqlpuzzle/regex/
詳説 正規表現
http://www.oreilly.co.jp/books/9784873113593/
正規表現プログラミングFAQ
http://capslockabcjp.kitunebi.com/faq.html
JScript 正規表現の概説
http://msdn.microsoft.com/ja-jp/library/28hw3sce%28v=VS.80%29.aspx
.NET Framework 正規表現言語要素
http://msdn.microsoft.com/ja-jp/library/az24scfc%28v=vs.80%29.aspx
【 初心者 】 正規表現 【 入門 】 ←閉鎖
http://funcchan.blog16.fc2.com/
クックブック ←追加
鬼車、鬼雲 ←追加
0004デフォルトの名無しさん
垢版 |
2017/03/15(水) 02:07:49.24ID:ko4BTSP2
◆関連スレ
[UNIX板] 正規表現
http://pc12.2ch.net/test/read.cgi/unix/1039165754/
[WebProg] 正規表現道場 Part2 ←板移転
http://kanae.2ch.net/test/read.cgi/php/1348048723/

◆前スレ
[1] http://pc8.2ch.net/test/read.cgi/tech/1062152374/
[2] http://pc8.2ch.net/test/read.cgi/tech/1131028296/
[3] http://pc11.2ch.net/test/read.cgi/tech/1156413899/
[4] http://pc11.2ch.net/test/read.cgi/tech/1186030400/
[5] http://pc12.2ch.net/test/read.cgi/tech/1212498448/
[6] http://pc12.2ch.net/test/read.cgi/tech/1241537764/
[7] http://hibari.2ch.net/test/read.cgi/tech/1268979408/
[8] http://hibari.2ch.net/test/read.cgi/tech/1301067486/
[9] http://toro.2ch.net/test/read.cgi/tech/1323566370/
[10] http://toro.2ch.net/test/read.cgi/tech/1340383120/
[11] http://toro.2ch.net/test/read.cgi/tech/1362913813/
[12] http://peace.2ch.net/test/read.cgi/tech/1387257592/
[13] http://peace.2ch.net/test/read.cgi/tech/1415149975/
0005デフォルトの名無しさん
垢版 |
2017/03/15(水) 02:08:13.70ID:ko4BTSP2
鬼車
http://www.geocities.jp/kosako3/oniguruma/index_ja.html
鬼雲
https://github.com/k-takata/Onigmo

Boost.Regex(日本語訳)
http://alpha.sourceforge.jp/devel/boost.regex_ja_1_45_0.pdf

秀丸: 複数行にまたがる検索について
http://homepage2.nifty.com/jr-kun/hidemaru_qa/4_regulr.html#RETURNS

サクラエディタ: 改行
http://d.hatena.ne.jp/myokoym/20101219/1292779058
※ サクラエディタでは複数行に渡る検索・置換は出来ません。

正規表現クックブック
http://www.oreilly.co.jp/books/9784873114507/

せいきなんとか
http://akiba.geocities.jp/hp20140401/
0006デフォルトの名無しさん
垢版 |
2017/03/15(水) 02:08:24.61ID:5ViZ5KQR
387:名無し募集中。。。:2017/03/15(水) 02:01:25
以下依頼します。
よろしくお願いします(宣言してスレ立て規制に引っかかった)

【板名】 プログラム技術
【板URL】 http://echo.2ch.net/tech/
【タイトル】 Regular Expression(正規表現) Part14
【名前(省略可)】
【メール欄(省略可)】
【本文】
Regular Expressionスレです。

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

前スレ
Regular Expression(正規表現) Part13
http://echo.2ch.net/test/read.cgi/tech/1415149975/


次スレは>>980宜しく
天ぷら等2以降
0007デフォルトの名無しさん
垢版 |
2017/03/15(水) 02:09:35.98ID:ko4BTSP2
[ ある "文字列" を含まない正規表現 ]

▽ 先読みが使える環境

((?!xyz).)* または (?:(?!xyz).)*
後者はカッコによるキャプチャを無効化しています。
1文字以上の繰り返しにしたい場合は * を + に書き換えて下さい。


▽ 先読みが使えない環境

オートマトンの知識が不可欠なため初心者にはまず無理です。
解説サイトですらほとんどがデタラメな作成方法を載せています。
↓正しい作り方はこちら。

xy を含まないものにマッチする正規表現 - Perl正規表現雑技
http://www.din.or.jp/~ohzaki/regex.htm#WithoutXY

xyz を含まないものにマッチする正規表現 - Perl正規表現雑技
http://www.din.or.jp/~ohzaki/regex.htm#WithoutXYZ

↓いろいろな文字列否定

タグの中に "ある文字列" を含まない正規表現
http://akiba.geocities.jp/hp20140401/2014/002.html
0008デフォルトの名無しさん
垢版 |
2017/03/15(水) 08:53:37.66ID:ZusWJMmJ
>>1
0010デフォルトの名無しさん
垢版 |
2017/03/15(水) 15:17:17.33ID:ARIh7/3F
習う習わないっていう材料はテキストに出てくるかどうかなのか?
(と言っても俺の時代学校によって採用するテキストの種類だって何種類もあったんだけど)
それともどっかの参考書も含むのか?
0011デフォルトの名無しさん
垢版 |
2017/03/15(水) 15:21:02.26ID:JuWg/t11
私は中学校で習いましたよ
0012デフォルトの名無しさん
垢版 |
2017/03/15(水) 16:23:05.39ID:FiGu7lnE
Regexの発音
https://www.youtube.com/watch?v=PGZldvNL2rw
http://english.stackexchange.com/questions/94371/
https://www.quora.com/What-is-the-correct-way-to-pronounce-regex

英語圏でもhard g派とsoft g派が半々
俺は語呂がいいからsoft g派 カタカナにするとレジェックス
英語で発音するときはリージェックスのほうが近いけどね

gifをギフって読む人がいるのと同じ
0014デフォルトの名無しさん
垢版 |
2017/03/15(水) 19:10:20.88ID:FiGu7lnE
それは略語じゃなくて元から英単語だからね
リーナスがジットって発音してたらそれが広まっただろうけど
0015デフォルトの名無しさん
垢版 |
2017/03/15(水) 23:15:08.29ID:GyMxol53
海外の動画見たら「SQL Server」を「シークルサーバー」って発音しててちょっと驚いた
0016デフォルトの名無しさん
垢版 |
2017/03/16(木) 01:57:00.56ID:y9TWt00W
>>15
そういえば昔、初めてRDBを学んだ頃
会社の先輩でSQLを「シークェル」て呼ぶ人いたわ
その人一人だけだったけど
0020デフォルトの名無しさん
垢版 |
2017/03/24(金) 06:37:22.44ID:J6kPEUuW
SQLの話まで行くともはやスレタイ関係ないじゃん、と思ったが>>19は面白かったわ
俺はsoft g、S-Q-Lで読んでるが、相手が先に違う読み方してたらそれに合わせてる
0021デフォルトの名無しさん
垢版 |
2017/03/29(水) 23:42:35.49ID:CyM0OTMA
質問

詳説 正規表現 第2版 持ってるんだけど、 詳説 正規表現 第3版 との違いって何かある?
第3版の方は5000円もするから大差ないなら買わないでおきたい
0022デフォルトの名無しさん
垢版 |
2017/03/30(木) 00:21:57.35ID:LEwdK5Fw
This third edition features enhanced PHP coverage in the early chapters,
plus an all new, expansive chapter devoted entirely to PHP regular expressions and how to wield them effectively.
Also new in this edition, the Java chapter has been rewritten and expanded considerably to reflect new features of Java 1.5 and Java 1.6.

って書いてるね
上に書いてる内容は目次の違い見ても分かるよ
0024デフォルトの名無しさん
垢版 |
2017/03/30(木) 01:42:52.91ID:1DorAGfX
失礼します。質問させていただきます。
複数行からなるデータを、指定したピッチ(行)おきに消したいのですが、やり方を教えて下さい!
例えば
中1行空けてなら1,3,5,7
中2行空けてなら1,4,7,10
中3行空けてなら1,5,9,13
の行を削除していくみたいな感じです。
出だしは1行目からでなくても、これは行の調整でなんとか出来そうです。
できるだけ手順が少ないのが理想です。やり方解る方マジ教えてほしいです!
手作業でやってて疲れてしました。まだいっぱいあります・・・お願いします。
0027デフォルトの名無しさん
垢版 |
2017/03/30(木) 03:34:41.36ID:Z/GqZVkW
何かスクリプトが使えるなら簡単だけど
正規表現だけでは難しそう
いらない行だけに含まれている
決まった文字、記号があるとか、またはその逆みたいな
いらない行を判断出来る要素があれば正規表現の検索置換で可能
0028デフォルトの名無しさん
垢版 |
2017/03/30(木) 04:00:51.53ID:Z/GqZVkW
あそっか、上から3行づつとかで切っていけばいけるのか
明日試してみよっと。
0029デフォルトの名無しさん
垢版 |
2017/03/30(木) 04:11:47.74ID:LEwdK5Fw
中1行ずつに削除なら(.*)¥n.* を ¥1に置換
中2行ずるに削除なら(.*)¥n.*¥n.* を ¥1に置換
みたいな方法でできるけど
特別な理由が無い限りエディタのマクロ使うかスクリプト使うね
003124
垢版 |
2017/03/30(木) 06:57:32.87ID:1DorAGfX
レスを頂い方々どうもありがとうございます。エディタのマクロでやる方がいいのですか!
これはいいことを知りました!マクロ使ったことないですがこの次に勉強してみようと思います。
>>29さん
教えて頂いた正規表現で出来ました!これでマジ助かります\(^o^)/
どうもありがとうございました。\(^o^)/
0032デフォルトの名無しさん
垢版 |
2017/04/01(土) 03:40:09.20ID:4EJbPXqm
(?i)((\S+ ){5}|^(\S+ ){0,5}?)(\bAAA\b)(( \S+){5}|( \S+){0,5}?$)

英文からある単語AAAを検索して前後5文字づつ一緒に取得
ただし途中に改行がある場合は改行前まで

上の表現で目的は達成したのですが
疑問が湧いたので質問です
A|Bのような単純またはではなくて
ifのような条件で切り替えるような正規表現はありますか?
(各種のスクリプト言語に依存しないやり方で)
合わせて、上の表現よりもこうした方が良いとかあったら
よろしくお願いします。
0035デフォルトの名無しさん
垢版 |
2017/04/02(日) 20:30:31.43ID:g6KuPxH9
ファイル名の置換(linuxのrenameコマンド)で
rename パール正規表現 対象ファイルで置換が出来るみたいです。

test_20140402_1810.m4aをtest_20140402.m4aに"_1800"を削除したいのですが、
rename 's/_d{4}\.m4a$/\.m4a/' test_20170402_1810.m4a
としてもうまく行かずにエラーも出ずにファイル名も変わりません。

"_"+"数字4桁"+".m4a"にマッチするようにして".m4a"に置換すればいいかと思ったのに出来ていない。
何処が間違ってますか?
0036デフォルトの名無しさん
垢版 |
2017/04/02(日) 20:41:25.41ID:TvISwdcG
>>35
dのところのエスケープ
あと置換文字列はピリオドにエスケープいらない
マッチしないだけだからエラーがでなくてもおかしくない
0038デフォルトの名無しさん
垢版 |
2017/04/12(水) 19:00:37.87ID:QHemYrmG
正規表現で任意文字以外を消すにはどうしたらいいですか?
検索でヒットしたものだけ残したいということです。
よろしくおねがいします。
0039デフォルトの名無しさん
垢版 |
2017/04/12(水) 20:59:49.88ID:u8woYKAJ
>>38
漠然とした質問だから漠然としか答えられないけど
キーワードを含む文全体(先頭から末尾まで)をマッチさせて
それをキーワードに置換させればいい
0040デフォルトの名無しさん
垢版 |
2017/04/12(水) 21:00:35.18ID:ud+oociV
[^(abc)]
これでabc以外の文字が全部選択できる
でもこれってどういう時に使うんだろう?
結局残るのがabcだけなら
わざわざ検索しなくてもよさそうだけど
0041デフォルトの名無しさん
垢版 |
2017/04/12(水) 21:12:14.06ID:u8woYKAJ
>>40
なんか勘違いしてそうな記述なんだけど?
それは、(,a,b,c,)の5文字以外の1文字を表してる
文字列abc以外を表すのなら
(?:(?!abc).)
004338
垢版 |
2017/04/12(水) 22:16:13.87ID:QHemYrmG
>>39>>40
レスをありがとうございます。
やろうとしてたのは下記例のような場合で、-で直接挟まれた文字のみ残したいというものです。

消-残-残--消 -残--消 -残-
消--残--消 -消 -残-
0044デフォルトの名無しさん
垢版 |
2017/04/13(木) 05:45:19.12ID:Bx+Z85rt
- と - の間の文字列で空白文字が入っちゃいかんということならこんな感じ?

perl -ne 'print( /(?<=-)([^-\s]+)(?=-)/g ,"\n")'

こういうことじゃないならもう少し説明を。
004543
垢版 |
2017/04/14(金) 03:41:56.00ID:8AuQ8qy9
>>44
レスをいただきありがとうございます。教えて頂いた記述はPerlということであってますよね?
Perlを導入して使ってみてからレスをお返ししようといろいろ調べていたら、大変遅れてしまい礼を欠いてしました。
いろんなサイトを見過ぎたせいか、結局導入方法が絞れないというか、よくわからなくり、
時間だけが過ぎましたので不甲斐なく申し訳ないですが兎に角お礼まで。どうもありがとうございました。
0048デフォルトの名無しさん
垢版 |
2017/04/14(金) 11:21:59.85ID:7lZUeeAF
置換でやるとすると、これでどうかな?
これなら適当なエディタやWSH(JScript)ででも実行できる
(先頭の.*?を[\s\S]*?に変えれば、改行コードは末尾のみになる)
ただ、もしかすると考慮抜けの場合があるかも

正規表現:/.*?-([^\s-]+)(?=-)|-*[^-]*?(\r)?$/mg
置換文字:$1$2
0049デフォルトの名無しさん
垢版 |
2017/04/15(土) 02:46:51.37ID:8aYCgh5m
レスをくださった方々、また遅くなりましたがありがとうございます。
>>46
こんな便利なものがあるんですね!教えていただきありがとうございます。またゆっくり触ってみたいとおもいます。
>>47
質問方法の不備を自覚しました。以後気を付けます。申し訳ありません。
>>48
サクラエディタで希望どうりの置換えが出来ました。本当にありがとうございます。
たて続けになり申し訳ないのですが。できればもう一つお聞きしたいです。
下記のような英文やその他も、単語と単語の間に入る半角スペースを許容することは可能でしょうか?
-Good Morning-
-残 残-

-東京都 港区 六本木-
-残 残 残-
0050デフォルトの名無しさん
垢版 |
2017/04/15(土) 09:28:31.10ID:7fUWShMv
>>49
それは別件なのか?
-a -b-
の場合、その条件なら
a b
が残ることになるけど?
それでいいなら、\sを抜くだけでもいいし、(?=-)も取ってもいい
0053デフォルトの名無しさん
垢版 |
2017/04/15(土) 10:21:57.02ID:7fUWShMv
これじゃまずい
/.*?-((?:[^\s-]| )*[^\s-])(?=-)|.*-(?:[^\s-]| )*[^\s-](?=[^-])|-*[^-]*$/mg
冗長かもしれない
0055デフォルトの名無しさん
垢版 |
2017/04/15(土) 11:39:21.99ID:8aYCgh5m
>>50-54
無理を利いてくださりありがとうございます。
実は最初の質問に穴があったので別件という形で再質問させていただきました。失礼しました。
教えて頂いた記述は完璧でした本当に感謝です!
レスも何度もくださってこの度は大変お世話になりました。
0056デフォルトの名無しさん
垢版 |
2017/04/20(木) 21:29:57.11ID:rsUIJG5Q
●Regular Expressionの使用環境
Becky!

●検索か置換か?
検索

●説明
+0900以外に一致

●対象データ
+
-
+0
-0
+09
-09
+090
-090
+0900
-0900
+09000
-09000
+09010
-09010
0057デフォルトの名無しさん
垢版 |
2017/04/20(木) 21:30:53.51ID:rsUIJG5Q
+
-
+0
-0
+09
-09
+090
-090

-0900
+09000
-09000
+09010
-09010

よろしくお願いします
※"+0900を含まない"を"+0900以外"を含むで実現したいです
0059デフォルトの名無しさん
垢版 |
2017/04/21(金) 12:02:05.13ID:30M0P9UI
zip版をダウロードしてchmヘルプファイルを見てみたら、
正規表現は本当に基本的なものしか無かった
(?!)はおろか()とかのキャプチャ自体無い(括弧は優先順位が上になるだけ)
[abc-d]もダメ( ([ab]|[c-d])と分けて書くらしい)
だから、やるなら
^[^+]|^\+$|^\+[^0]|^\+0]$|^\+0[^9]|…と全ての場合を併記するしかないかも
0060デフォルトの名無しさん
垢版 |
2017/04/21(金) 14:10:39.59ID:P/4d/uOg
鬼車や鬼雲使わず独自実装なんだね。シェアウェアだからかな
非包含か先読みを使えなきゃ実質無理だと思う
^\+0900$ の方をどうにかする運用を考えた方が良い
Beckyの公式のメーリングリストや掲示板で正規表現じゃなく具体的にやりたい事を質問してみたら?
上手い運用方法を思い付いてくれる人が居るかも
0061デフォルトの名無しさん
垢版 |
2017/04/21(金) 16:15:06.41ID:hNfgTF//
GPLならいざ知らずPCREや鬼車, 鬼雲もBSDライセンスだからなぁ
誰か外部の高機能正規表現ライブラリを利用するプラグインとか作ってそうだけど
0062デフォルトの名無しさん
垢版 |
2017/04/22(土) 00:09:10.84ID:R9IUk1ak
>>57
if ≠"+0900" みたいなやり方が1番簡単だけど正規表現だと面倒

≠ や = にまで拡張した正規表現があればいいんだ
006356
垢版 |
2017/04/22(土) 01:50:21.67ID:IwPPNWuo
>>56分かる方いたら教えてください
よろしくお願いします
0064デフォルトの名無しさん
垢版 |
2017/04/22(土) 04:17:39.78ID:T741eTMO
ほらよ。使い物になるかは知らんが示された対象データにおいては要件を満たす
^(.{,4}|-0900|.{6,})$

量指定子の{}が使えないなら
^(.|..|...|....|-0900|......)$

Beckyの仕様が一般的なPerlの正規表現とは違うならここで聞いても分かるやつ少ないだろうし
後出しする必要が出たらBeckyの方で聞いた方がいいぞ
0065デフォルトの名無しさん
垢版 |
2017/04/22(土) 17:13:13.21ID:1zuuifbC
>>63
+0900のみのデータなんて普通は無いよね
こういうのはJSTとかの時刻の後ろにつくもんじゃないの?
何がしたいのかよく解からないんだが?

フィルタで使うんなら、〜が「ある時」「ない時」と選択できるようだから、
「ない時」にチェックすれば君の要件どうりなら、指定は^+0900$でよいことになる(+0900のみがない時ということになるけど)

だけど、上で疑問視したように+0900の前に時刻があるならマッチしなくなるよ
006756 ◆mUjtBupG2M
垢版 |
2017/04/22(土) 21:58:03.61ID:UjWxDTr1
レスくださったみなさんありがとうございます
>>58>>60
使えませんでした
>>59
そうなんです、基本的なものしかないのでどうすればいいのか分からず
>>62
ですね
>>64
使い物にならん!
>>65
+0900以外がある時(>>56の求める結果)と+0900がない時だと、前者
じゃないと駄目なんです

自分でなんとか書いてみました
(\-[0-9][0-9]*)|(\+0[0-8][0-9]*)|(\+09[1-9][0-9]+)|(\+[0-9]*[1-9]$)|(\+09[0-9]?[1-9]+[0-9]?)|(\+0900[0-9]+)|(\+090$)|(\+0$)
0068デフォルトの名無しさん
垢版 |
2017/04/23(日) 02:31:41.68ID:hK6ntaQJ
Beckyって基本的なものとはいえ正規表現使えるのか、いいなぁ
会社で強制使用のOutlookなんか and or しかない上に
検索語を入力中に変なところで勝手にor区切りするわフォーカス外れるわでもうムチャクチャ
仕事で何年も前のメール探すのに絞り込めなくて、最終的には数百通人間grep状態しょっちゅう…
0073デフォルトの名無しさん
垢版 |
2017/04/23(日) 07:11:51.07ID:2K1Rl01+
^[^+]*$|\+(|0*[0-9]|0*[1-9][0-9]|[1-9][0-9][0-9]|0([1-7][0-9][0-9]|8[0-9][0-9])|0(90[1-9]|9[1-9][0-9])|[1-9][0-9][0-9][0-9]|[0-9][0-9][0-9][0-9][0-9]+)([^0-9]|$)

●入力と結果(✓一致 ❌不一致)
✓ Sat May 24 08:05:44 2014
✓ Tue Mar 28 06:21:47 2017 +
✓ Tue, 26 Jul 2016 23:55:46 -0
✓ Wed, 05 Oct 2016 15:24:09 -0900
✓ Wed, 4 Mar 2015 08:39:08 +09000
✓ Fri, 30 Oct 2015 07:56:41 +00900
✓ Wed, 4 Mar 2015 08:39:08 0900
❌ Wed, 25 Mar 2009 14:18:41 +0900
❌ Tue, 8 Mar 2016 16:11:55 +0900 (JST)
❌ Sat, 24 Jul 2004 03:48:21 +0900<br>
007556 ◆mUjtBupG2M
垢版 |
2017/04/23(日) 22:57:55.33ID:/2AcrhSu
>>72
質問に忠実な正規表現ありがとうございました

>>73
きゃー素敵!と冗談はさておき
まさに望んでいたものでした、本当にどうもありがとうございました!
0076デフォルトの名無しさん
垢版 |
2017/04/28(金) 19:19:48.10ID:VBxbz7un
正規表現を勉強し始めた者です
>>73の正規表現について2つ質問させて下さい

展開すると以下のようになりますよね
^[^+]*$   「+」が無い行に一致。残りは「+」が在る行
(
「+」に数字が続く場合の0〜3桁とその先頭に0が続くパターン ※Q1
\+
\+0*[0-9]
\+0*[1-9][0-9]   [1-9]なのは0*0[0-9]は0*[0-9]に含まれているから
\+[1-9][0-9][0-9]  3桁目で0*とすると0900にマッチしてしまう

4桁で「0900以外」のパターン ※Q2
\+0[1-7][0-9][0-9]
\+08[0-9][0-9]
\+090[1-9]
\+09[1-9][0-9]
\+[1-9][0-9][0-9][0-9]

\+[0-9][0-9][0-9][0-9][0-9]+  5桁以上
)
([^0-9]|$)  続く文字が数字以外もしくは行末。これが無いと+0900に3桁以下の式でマッチしてしまう

Q1
3桁までの表現に0*としてるのはなぜなのでしょうか?
素人考えには
[0-9]?
[0-9][0-9]
[0-9][0-9][0-9]
で良いのでは?と思うのです。 [0-9]?|[0-9][0-9][0-9]? これでも0〜1桁と2〜3桁になりますよね?
「0*」という書き方の方が処理が速くなったりとか何か理由があるのでしょうか?
007776
垢版 |
2017/04/28(金) 19:24:12.30ID:VBxbz7un
Q2
\+0[1-7][0-9][0-9]
\+08[0-9][0-9]
[1-7]なのは00の場合1〜3桁の式と被るから1からなのだと思うのですが
この2つは合わせて \+0[1-8][0-9][0-9] としてはダメなのでしょうか?

「0900以外」の4桁の数字のパターンは以下のようになるかと思います
[1-9][0-9][0-9][0-9]  0xxx
[0-9][0-8][0-9][0-9]  x9xx
[0-9][0-9][1-9][0-9]  xx0x
[0-9][0-9][0-9][1-9]  xxx0

被っているところを数値に置き換え
[1-9][0-9][0-9][0-9]
0  [0-8][0-9][0-9]
0  9  [1-9][0-9]
0  9  0  [1-9]

一応Q1と合わせ疑問に思ったところを書き換えて>>73さんのサンプルと+0〜+10000と+0000〜+9999をテキストに書き出して
テストしてみたところ問題無さそうなのを確認したのですがそれでも確信が持てず質問させて頂きました
試した式は以下になります
^[^+]*$|\+([0-9]?|[0-9][0-9]|[0-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|0[0-8][0-9][0-9]|09[1-9][0-9]|090[1-9]|[0-9][0-9][0-9][0-9][0-9]+)([^0-9]|$)
^[^+]*$|\+((|[0-9][0-9])[0-9]?|([1-9][0-9]|0[0-8])[0-9][0-9]|09([1-9][0-9]|0[1-9])|[0-9][0-9][0-9][0-9][0-9]+)([^0-9]|$)
^[^+]*$|\+(|090[1-9]|((([0-9][0-9]+|(|[1-9]))[0-9]|(|0[0-8]))[0-9]|(|09[1-9]))[0-9])([^0-9]|$)

身近に聞ける人が居ないので自分の解釈が間違っていたり何か見落としているのではないか?と悶々としております
どなたか分かる方が居られましたら2つの疑問点の回答をお願いしたいです
また解釈を間違えている箇所がありましたらそちらも指摘下さい。よろしくお願いします
0078デフォルトの名無しさん
垢版 |
2017/04/29(土) 18:45:01.61ID:0PD6E3oz
>>76-77
どちらも深い意味はないよ
行き当たりばったりで何とかテストに通るようにしただけだから

> 3桁までの表現に0*としてるのはなぜなのでしょうか?

コメント付けてくれた通りまさしく「0〜3桁とその先頭に0が続くパターン」
という順序で考えてたから結果的にそうなったのだと思う
まず0から999に一致するパターンを書いて、それに 0 が先行する場合 0* を足して
でも 0900 には一致しないように… とかそんな感じ

> この2つは合わせて \+0[1-8][0-9][0-9] としてはダメなのでしょうか?

ダメじゃない
その辺りはこのジェネレーターで生成した正規表現をもとにしてる

Regex Numeric Range Generator
http://gamon.webfactional.com/regexnumericrangegenerator/
100–899 ⇒ ([1-7][0-9]{2}|8[0-8][0-9]|89[0-9])

たまたま 8[0-8][0-9] と 89[0-9] がまとめられると気がついたのでそこは直したけど
全部まとめられるとは気づいてなかっただけ
0079デフォルトの名無しさん
垢版 |
2017/04/30(日) 00:11:00.00ID:PxU3UZJt
>>78
回答ありがとうございます
つい先日覚え始めた身ながらも>>73さんの式に感銘を受け是非とも理解したく思い
分からない事だらけの中、自分であれこれ分解したり試したりしていたのですが
疑問に思った点を自力で晴らす事が出来ず質問させて頂きました
未熟故に不理解な部分があるのではないかと思っておりましたが
「どちらも深い意味はない」との事で少々肩透かしでしたが安心しました
無知故に身構え過ぎていたようです
作成の経緯や方法まで丁寧に説明して頂きありがとうございました
今後の参考にさせて頂きます。感謝!
0081デフォルトの名無しさん
垢版 |
2017/04/30(日) 04:34:43.13ID:smayr5dM
>>80
確かに邪魔だけど、おこるほどじゃない
0082デフォルトの名無しさん
垢版 |
2017/04/30(日) 07:25:58.21ID:PxU3UZJt
>>80
それも少し思ったんだが重箱の隅をつついてると受け取られ答えてもらえないんじゃないかとか色々悩んだ末 出来るだけ丁寧にとこうなった
もし次があったら気を付ける。すまんかったな
0083デフォルトの名無しさん
垢版 |
2017/04/30(日) 07:50:01.45ID:BxxkE9Fv
丁寧な方がいいに決まってる
>>80はバカだから長文がウザいことに気付かず
丁寧語がウザいと的外れな指摘をしている。
0084デフォルトの名無しさん
垢版 |
2017/04/30(日) 08:21:18.33ID:PxU3UZJt
>>83
自分を非難している相手を擁護するのは変な感じだが
バカかどうかはあの一文からは分からないでしょ
それに自分も慇懃無礼にあたらないかとは危惧していたし的外れとは言えないと思う
何でも度が過ぎるのは良くない
だが齟齬を生じさせないようにする為にはこういったスレで長文になるのは仕方なくないか?
身の丈に合わない質問して「この解釈で合ってる?」みたいな聞き方した自分にも非があるとは思うが
バカ丁寧禁止より長文禁止の方が厳しいと思うわ
0086デフォルトの名無しさん
垢版 |
2017/04/30(日) 12:18:27.09ID:VPr4LyhY
丁寧なことが必ずしも良いとは限らない
質問するときは相手のことも考えて無駄を省くことが大事
質問を整理している間に自分で気付くこともある
0087デフォルトの名無しさん
垢版 |
2017/04/30(日) 15:52:39.90ID:3TcYedTF
>>84
>バカ丁寧禁止より長文禁止の方が厳しいと思うわ
読む側は馬鹿丁寧な長文=好感が持てる、長文でも許せる
丁寧でないけど長文=丁寧でない癖に長文だとぉ〜?!許せん
ってなる
0089デフォルトの名無しさん
垢版 |
2017/05/01(月) 09:32:05.11ID:lsW6qson
長文NGしてれば見なくて済むのにわざわざ見てウゼェ言ってる奴って
マゾなの?やり方分かんないバカなの?ウゼェ言ってる俺カッケーな池沼?
0091デフォルトの名無しさん
垢版 |
2017/05/01(月) 18:42:02.68ID:Ypd7EE7u
ダ・ヴィンチ曰く「単純であることは究極の洗練だ」
今回の例にどれほど当てはまるかはわからんが、目指すのはそこだ。
0092デフォルトの名無しさん
垢版 |
2017/05/03(水) 15:46:12.05ID:/wkwyrKC
検索置換を教えて下さい。
行末の半角数字(桁数はまちまち)を行頭に移動したいです。
──────────────
■置換前■

abc1
東44
4-123
あいうえお02
──────────────
■置換後■

1abc
44東
1234-
02あいうえお
──────────────
使ってるエディタはgpadです。サクラエディタもあります。宜しくお願い致します。
0093デフォルトの名無しさん
垢版 |
2017/05/03(水) 16:08:53.89ID:KtRh/Jcn
>>92
gpadやサクラエディタは知らんけどJSならこんな感じ

replace(/(.*?)([0-9]*)¥n/g, "$2$1¥n")

最後の行にも改行がある前提
なければ入力の最後を示す$をOR条件として指定する
0094デフォルトの名無しさん
垢版 |
2017/05/03(水) 17:09:36.61ID:/wkwyrKC
>>93
ありがとうございます。レスをいただき申し訳ないのですが、
最初に書いているようにテキストエディタでできる検索置換を教えて頂きたいのです。
0097デフォルトの名無しさん
垢版 |
2017/05/04(木) 02:53:36.15ID:P+e+GY0n
●Regular Expressionの使用環境
Bash on Ubuntu on Windows での sed

●検索か置換か?
置換

●説明
[ と ] で括られた最初の文言以外を削除したい

●対象データ
aaa[bbb]ccc
[ddd]eee
fff[ggg]hhh[iii]jjj
kkk

●希望する結果
bbb
ddd
ggg
空行、もしくは、そのまま(上記だとkkk)


cat hoge.txt | sed -e 's/.*\(\[.*]\)/\1/g'

で行けそうな気がしたんですが、結果は
[bbb]ccc
[ddd]eee
[iii]jjj
kkk
この有様。誰か助けてください。
0099デフォルトの名無しさん
垢版 |
2017/05/04(木) 03:22:48.12ID:7TNYL3q7
cat test.txt | sed -E 's/[^\[]*(\[[^\[]*\]).*/\1/g'

sedはnon-greedyサポートしてないので[^\[]*で
"["以外の文字にマッチするように指定する
0100デフォルトの名無しさん
垢版 |
2017/05/04(木) 10:29:51.92ID:P+e+GY0n
>>98
cat hoge.txt | sed -e 's/\].*\|.*\[//g'
これだと3行目が2つ目の [ ] のを拾ってしまった。

bbb
ddd
iii
kkk


>>99
cat hoge.txt | sed -E 's/[^\[]*(\[[^\[]*\]).*/\1/g'

[bbb]
[ddd]
[ggg]
kkk

狙い通りのが拾えました。[ ] が付いてくるけどそれは自分で外します。
どうもありがとうございました。
0105デフォルトの名無しさん
垢版 |
2017/05/07(日) 07:31:07.21ID:fOF53fEF
そもそも誤訳だし
0106101
垢版 |
2017/05/07(日) 16:34:35.27ID:fwX9OlSY
>>104
なるほどおおおおぉぉぉ!!!
合点がいきまくりんぐです。ありがとうございます!
0107デフォルトの名無しさん
垢版 |
2017/05/13(土) 23:19:52.64ID:4xoUv3bU
書き込めない?
0108デフォルトの名無しさん
垢版 |
2017/05/14(日) 17:21:45.80ID:IUk17Lsy
●Regular Expressionの使用環境
サクラエディタ

●検索か置換か?
検索

●説明
「ABC」の英大文字と小文字を区別せずに検索したいのですが
書き方はあるのでしょうか?
今は『abc|Abc|ABC』という正規表現を使っていますが
書くのがめんどうだし、aBcやabCにもヒットさせたいので
もっと簡潔な書き方があれば教えて下さい。
0111デフォルトの名無しさん
垢版 |
2017/05/14(日) 20:19:12.83ID:IUk17Lsy
>>110
すみません、実はJaneStyleなど複数の環境で正規表現を使っていて、一番よく使うサクラエディタを例に出してしまいました。
確かにサクラエディタだと「英大文字と小文字を区別する」ってチェックがありますよね・・・

>>109
ありがとうございます!バッチリいけました。 ><
0112デフォルトの名無しさん
垢版 |
2017/05/27(土) 19:51:02.34ID:gdXMy//z
●Regular Expressionの使用環境
テキストエディタMeryでの強調文字列指定について質問です
http://www.haijin-boys.com/
Onigmo (Oniguruma-mod) (regular expression library) 5.15.0
https://github.com/k-takata/Onigmo

●検索か置換か?
検索?

●対象データ
"D:\PATH\HOGE",1,307,,0,"15/01/01 00:00:00","12/12/31 00:00:00",1,1,,,,"著者X",,,,,"タイトルA",,,2,,,,,1,1101,1101
"D:\PATH\FUGA",,,,,,"15/02/01 00:00:00",1,1,,,,,,,,,"名前B",4,,0
"E:\FOLDER\PIYO",20,197,91,0,"16/03/01 00:00:00","15/04/01 00:00:00",1,1,,,,"著者Y,Z","出版社",,,,"題名C"

●希望する結果
上のようなテキスト各行の最後に出現するダブルクォーテーション囲いの文字列
"タイトルA"
"名前B"
"題名C"
を取得して強調表示したいのですがどのような正規表現で記述すればよいのでしょうか?
あるいはダブルクォーテーションを含まない状態(タイトルA、名前B、題名C)でも差し支えありません

●説明?
・各行でカンマや "" 囲いの数はまちまちで、"" 囲いの中にカンマがある場合もあります
・"" 囲いの中のカンマを無視した場合、17番目のカンマの直後の "" 囲い部分です
・"タイトルA"、"名前B"、"題名C"のあとに続く文字列の長さ、形式は不定です
・対照データはマンガミーヤのブックリストです

よろしくお願いします
0114112
垢版 |
2017/05/28(日) 07:52:06.42ID:5aByZaI0
>>113
両方のパターンを教えていただきまして、ありがとうございます

"フォルダパス" の "[A-Z]:\\.+?" と "年/月/日 時:分:秒 "の "../.+?"
タイトルフィールドだけは全/半スペースで字下げして "[  ]+.+?" というパターンまでは作れましたが
字下げなしで強調表示できるようになり、一層見分けやすく、編集しやすくなりました

なぜこれらが最後の "タイトル" 部分にマッチするのか、まだ理解できてはいないのですが
読み解けるように頑張ってみます
0115112
垢版 |
2017/05/28(日) 11:31:39.10ID:5aByZaI0
先読みと後読みの使い方をなんとなく理解できるようになったかも?という感じで、自分で同じ表現をすぐに導き出せるかとなるとまだまだ難しそうです

調子にのって後読みで12番目のカンマの後ろの "著者" にマッチさせようとやってみましたが、繰り返し表現をふくむ後読みはダメだとか…
^".+?"([^,]*,){12}".+?" で「行頭から"著者"まで」はできても ^(?<=".+?"([^,]*,){12})".+?" では機能しないんですね
あれこれ弄り回して "タイトル" からカンマ5つ戻るかたちで先読みにして "[^"]*"(?=(,[^,]*){5}"[^"]*"(?=[^"]*$)) にしたら "著者" に
同様に {4} で "出版社" にマッチしました

おかげさまで色々と勉強になり、あらためてありがとうございました
0116デフォルトの名無しさん
垢版 |
2017/05/28(日) 12:13:46.77ID:IsUf2Pl+
こんな古代呪文みたいなの、実際に仕事とかで使ってないとなかなか覚えないし
覚えてもすぐ忘れてしまうよなw
全てのパターンを記憶して空で完全詠唱できる人なんているんだろうか?
0117デフォルトの名無しさん
垢版 |
2017/05/28(日) 13:15:52.74ID:QUomuFPF
暗唱できる必要性があるのか?
使うときにそういうのがあったなあって思う出すだけでいいだろ
あとは詳細を見て使えばいいだけ
0118デフォルトの名無しさん
垢版 |
2017/05/28(日) 13:26:02.06ID:35oU3ReV
仕事じゃなく趣味で覚えたけど
間違いなく覚えた方が便利

どっかに正規表現化してるだけでお金貰える仕事ないかな
0120デフォルトの名無しさん
垢版 |
2017/05/28(日) 16:06:45.06ID:MqtJ47ff
言語環境ごとに使える使えない、エスケープ必要不必要を間違えたりする
サポートしてない環境の多い先読みとかは他の手段使っちゃったりするからなかなか使いこなせない
0121デフォルトの名無しさん
垢版 |
2017/05/28(日) 16:10:29.49ID:W53JMrzP
$1 と \1 を間違えて泣きをみて以来、むしろ記憶しないようにしている……・
0124デフォルトの名無しさん
垢版 |
2017/05/29(月) 11:05:33.03ID:sPbSPx8D
コマンドプロンプトのfindstrコマンドで使えるやつより貧弱な正規表現環境なんてないよね?
0128デフォルトの名無しさん
垢版 |
2017/05/30(火) 13:16:32.07ID:V9BCWx6K
>>118
とある地方の区画整理の際、住所表記が変わるので
住所を正規化するために正規表現と簡単なDB処理とを組み合わせた
単純な処理を行うだけの1日仕事で、
そこらのリーマンの3ヶ月分ぐらいお金になった事とかあったな

仕事柄色んな会社を訪問するけど
テキストの簡単な置換すらできない(まずテキスト置換という概念を知らない)人って
事務程度でしかパソコン使わない人にはめちゃくちゃ多いんだよね

そんなに人達に (.+)abcd\n みたいな初歩的な正規表現を教えると
物凄く驚かれる

見下すようだけど世の中そんなもん
0129デフォルトの名無しさん
垢版 |
2017/05/30(火) 17:50:42.66ID:bhgaCfDA
>>128
まぁハードル高いよね、低くないと言うべきか

知らなきゃ「正規表現」というチェックボックスがあっても、それが何をするものなのか
言葉から具体的イメージが全く湧かないし
ヘルプ見てはじめて何をするものなのかわかるという、といっても具体例が
無ければヘルプ見たところで「難しそう>便利そう」になりがち
一目で「難しそう<便利そう」になるならとっくに正規表現を使ってる層だろうし

ファイルの検索 や excel や word や メモ帳 、IE、Edge あたりに正規表現が
最初っからあれば話は違ってくるんだろうなと

Mac触った事ないからアレだけど、Macなら充実してるのかしら?
0130デフォルトの名無しさん
垢版 |
2017/05/30(火) 22:14:32.37ID:wMq9WrJJ
>>129
システム屋やってる人間からしても正規表現って見るからにとっつきにくそうだもんな。
システム会社なのに知らない人間の方が多いというw
0131デフォルトの名無しさん
垢版 |
2017/05/30(火) 22:28:36.41ID:RvF0nsOU
>>130
えー
プログラム組む人種なら例外なく好物だと思ってたんだが(^^;;
0135デフォルトの名無しさん
垢版 |
2017/05/31(水) 08:06:38.95ID:rBoo2fCo
小さな会社だと他より少しPC関連に詳しいってだけでIT部長とか言われこき使われる
勿論そんな役職なんて無い
正規表現なんて言葉を発したらセクハラだの変態だの言われかねん
0136デフォルトの名無しさん
垢版 |
2017/05/31(水) 11:16:23.49ID:u9qpXxTe
>>135
正規表現で置換
とか知らない人が聞いたらアレだもんなw

>>133
正にその世代だけど
昔のperlは正規表現抜きでも変態記法満載だったから
だんだん昔のコードは読めない人が増えてきてる

$line =~ s/(?:\x0D\x0A|[\x0D\x0A])?$/,/;
@values = map {/^"(.*)"$/s ? scalar($_ = $1, s/""/"/g, $_) : $_}
10年ぐらい前のメモからのコピペだけど見ただけで目眩がするw
0137デフォルトの名無しさん
垢版 |
2017/05/31(水) 11:27:09.17ID:u9qpXxTe
>>132
一概にシステムといっても色々あるからね

機器制御系システムなんかだと正規表現を使う機会なんてまず無いだろうし
WEB系の事やってるなら何だかんだで正規表現を使う機会はそこそこあるだろうし
0138デフォルトの名無しさん
垢版 |
2017/05/31(水) 11:46:52.88ID:AV1cHHAT
CSV は、" などのエスケープについて、様々な方言があるから、正規表現では無理。
CSV の方言・規格を確定させてから、Ruby を使うべき

バグのほとんどが設計段階・仕様で生じる。
方言さえ確定していれば、バグらない
0140デフォルトの名無しさん
垢版 |
2017/05/31(水) 12:15:57.63ID:u9qpXxTe
>>138
仕事内容にもよるけどそんな事はない
なんせ世の中にはExcelのデータが糞ほどあるので
「Excelルールのcsvを正規表現で処理する+α」の仕事だけでも
たぶんそこらのリーマンよりは稼がせてもらってきたよ

日本の企業の大半は中小企業なわけだけど
ほんと信じられないほど無駄な事やってる会社がたくさんあるからね
こんな時間に2chなんてやってられるのも、そのお陰ですわ
0142デフォルトの名無しさん
垢版 |
2017/05/31(水) 12:44:32.50ID:gy6WrZsR
>>138
Rubyを使うべき、と言う唐突な結論以外は同意できる。
Ruby (のようなスクリプト)を使うべきなら完全に同意できたのに。
0143デフォルトの名無しさん
垢版 |
2017/05/31(水) 16:04:23.05ID:jFN45aLj
>>142
少し日本語は下手だが、
事前にCSV の方言・規格を確定すべし
という主張と読んだ。
0144デフォルトの名無しさん
垢版 |
2017/05/31(水) 17:04:05.88ID:MQUo5X9j
なぜrubyなのかよく分からん
多少正規表現エンジンの種類やバージョンの違いはあれど
正規表現はperlでもPHPでもJavaScriptでもPythonでも使えるし
rubyの正規表現なんて昔はコールバック処理するのがくそ面倒だった筈だが
0145デフォルトの名無しさん
垢版 |
2017/05/31(水) 17:10:42.06ID:BtqSGsFQ
正規表現を使わずにrubyでやれと言いたいのでは
まあ確かにrubyは標準で簡単強力なcsv処理ができるけど
ruby以外でのcsvの処理の仕方を知らない知識不足な人の戯言にしか見えない
0148デフォルトの名無しさん
垢版 |
2017/06/01(木) 04:08:09.64ID:+TrYOuL5
>>134
VB(今時は.NET)では入力チェックとかでよく使うからお前の偏見だよ。
0149デフォルトの名無しさん
垢版 |
2017/06/01(木) 04:08:53.15ID:+TrYOuL5
>>134
いい忘れたがサクラのマクロもよく使う。
0152デフォルトの名無しさん
垢版 |
2017/06/01(木) 05:39:57.85ID:pPoV2n06
そもそもテキスト処理じゃないと使わんよ
使う使う言う奴はプログラミングの分野が偏ってるんじゃないか?
0153デフォルトの名無しさん
垢版 |
2017/06/01(木) 06:10:29.36ID:htPbJpjE
エンドユーザーに近い分野で使うというより、開発者が使うものでしょ。SQLとかと同じ。
0154デフォルトの名無しさん
垢版 |
2017/06/01(木) 08:16:36.86ID:YbQp1MN1
>>153
そりゃプログラムから使うものだから開発者しか使わんよ
そう言う意味じゃなくて利用者が入力した値の妥当性確認とかに使うケースが多いんじゃね?
って話なんだろ
0161デフォルトの名無しさん
垢版 |
2017/06/01(木) 21:36:20.85ID:z/dTvzRJ
一般に正規表現自体をどこで使うかの話と違うんか?
プログラマがどこで使うかって文脈に限定してるのんか?
0162デフォルトの名無しさん
垢版 |
2017/06/02(金) 00:26:45.39ID:ixZw1vso
perlがそうであったようにログ読んだり整形したりするときにも良く使う。システム管理者。
プログラマによっては無理に正規表現使わないで正規表現を引数に取らないcontainとか複数行で書くって人もいるんじゃないか。入力チェックもそんな考えるような正規表現の出番少ないような。
perlくらい言語に組み込まれてるならともかく。
0164デフォルトの名無しさん
垢版 |
2017/06/02(金) 14:02:59.19ID:s9L+1vWi
正規表現、難しいですね…全然わかりません
お知恵をおかし下さい

例えば

test = "//abc"; // コメント "です"


という一行があった場合、後半の

// コメント "です"

にだけマッチする正規表現はどのように書いたらいいんでしょうか?

最初は

/(?!.*(\"|\'))\/\/(.*)/

こんなカンジで否定的先読みを利用していたのですが、
コメント部にも、 シングル及びダブルクォーテーションが入る可能性が出てきたので、
この書き方では ?! で否定しているためなのかマッチ出来ません。

何か良い書き方はありますでしょうか?
やりたい事は、PHPなどで、javascriptのソースから単一行のコメントを削除したいです。
よろしくお願い致します。
0166デフォルトの名無しさん
垢版 |
2017/06/02(金) 20:31:58.40ID:KFrvDlYH
PHP は知らん

$perl -ne 'm%((?:\".*?\"|/(?!/)|[^/])*)(.*)% ; printf("<$1> <$2>\n");'
test = "//abc"; // コメント "です"
<test = "//abc"; > <// コメント "です">
// コメント "です"
<> <// コメント "です">
$
0167デフォルトの名無しさん
垢版 |
2017/06/02(金) 21:10:46.42ID:yyLeCvfJ
末尾方向から、// を探して、もしあれば、その行を選択する。
^.*\/\/(ここに、2連続以上の、/ が存在しない)$

/// 例えば、3連続でも、コメント扱いするよな?
test = "///abc"; /// コメント "です"

シングルクォーテーションは、どうするんだ?
test = '///abc'; /// コメント "です"
0168デフォルトの名無しさん
垢版 |
2017/06/02(金) 23:18:34.61ID:cODXM6Ca
javascriptだから、シングルダブルは同等機能
"'"とか'"'とか有だし
"\""とかのエスケープもある
"//abc"は文字列だし、"\""//abc"はコメント
0169デフォルトの名無しさん
垢版 |
2017/06/03(土) 00:22:48.22ID:02UJhjHA
みなさん、ありがとう御座います!
165さんの短いのでサクっと出来ました!

なるほど、末尾から検索をかけるとう考えなんですね。

本当に奥が深くて、使いこなすのは難しいです…

いろんなパターンを作りだし、自由にマッチ出来るよう精進します

>165-167さん、ありがとう御座いました!
0171165
垢版 |
2017/06/03(土) 01:16:11.91ID:janVI+9u
>>169
ツッコミか逆ギレ待ちだったんだが…
165ではコメントが無くてコード中に//がある場合にそのコードの部分にマッチする
削除だとコードを削ってしまうよ
コード中に//が無い場合、またはコード中に//がある場合にその後ろにコメント行がある場合、限定
マトモなのは「JS コメント 正規表現」とかのワードでggr
0173デフォルトの名無しさん
垢版 |
2017/06/03(土) 02:57:17.44ID:02UJhjHA
>>171
え!?
限定的なテストで、思ったとおりの動きをしたので、おお!すげー!って思ってました…

実際のスクリプトには、まだ組み込んでないので気付きませんでした

他の方が書かれてた方法も試したり、ググってみますね
0174デフォルトの名無しさん
垢版 |
2017/06/03(土) 04:51:38.86ID:ZUxfcpWv
区切り記号 ; や閉じ括弧 } のあとにスペースかタブいくつかの後に来る // から行末をコメントと見なすのが簡単?
0175デフォルトの名無しさん
垢版 |
2017/06/03(土) 12:52:21.44ID:7vig672V
コメント化は、プログラムデバッグ中にも命令を無効にするために使うこともあるし、ことはそう簡単じゃないよ
//if(hoge=="http://hoge.net";) {//コメント
0176デフォルトの名無しさん
垢版 |
2017/06/03(土) 14:13:52.35ID:ep62Y9tf
これは、無限の組み合わせがあるから、正規表現じゃ無理

AST変換とか、LLVMでコンパイル後の命令木をもらって、
コメント部分を削除するとかしないと、自力じゃ無理なレベル
0181デフォルトの名無しさん
垢版 |
2017/06/03(土) 16:32:48.16ID:7vig672V
何それ限定なの?
06\/03\(
(スラッシュにエスケープが要らない場合もあるけど付けといてダメなことはない)
0183デフォルトの名無しさん
垢版 |
2017/06/03(土) 22:49:00.44ID:yEDWU2+/
正規表現って本当に色々なパターンでテストしないと抜けがあったりするから怖いね
0184デフォルトの名無しさん
垢版 |
2017/06/03(土) 23:15:22.50ID:eiMrU4PF
>>183
それは仕様を理解していないから。
正規表現で表現してあるパターン以外にマッチする事はないんだから、
抜けがあるならパターンの意味を理解していないって事
0187デフォルトの名無しさん
垢版 |
2017/06/05(月) 17:11:30.09ID:oWlVC1QB
非欲張り、欲張り、強欲の違いが分からなかったんだけど
ttp://d.hatena.ne.jp/atzy/20110309/p1
これ読んでやっと分かった
こりゃエディタの検索で試してるだけじゃ理解出来なくて当然だね

誰か同じように例を交えて先読みと戻り読みのロジックを解説して欲しい
それか解説してるwebページがあるならリンク貼って下さい
0188デフォルトの名無しさん
垢版 |
2017/06/09(金) 23:50:59.51ID:fJoQB/gQ
●Regular Expressionの使用環境
秀丸 HMJRE.DLL V5.00
●検索か置換か?
置換
●説明
文章最後の文字からEOFまでの 空白(全角半角両方) タブ 改行 を消したい。
●対象データ
AAAAA

BBBBB

CCCCC
 

[EOF]

●希望する結果
AAAAA

BBBBB

CCCCC[EOF]
0191デフォルトの名無しさん
垢版 |
2017/06/12(月) 04:37:37.47ID:40WtKqR9
>>187
Qiitaなのでコメントまで必ず読むこと

正規表現の先読み/後読みを「絞り込み」と理解してみる - Qiita
http://qiita.com/blackenedgold/items/382704cc54c8e42819d0

[コラム] 正規表現の先読み/後読みは、どう考えても名前が悪いので、呼称禁止令を出してルックと気軽に呼んでみませんか。 - Qiita
http://qiita.com/mochizukikotaro/items/84f3ab2740b8efbe0dc6

後者は日本語表現のネタモノなので理解にはあまり役に立ちませんが
0198デフォルトの名無しさん
垢版 |
2017/06/16(金) 00:00:22.35ID:AvJwaQP1
>>193
そんな感じがする
でも定着して何十年経過したからいまさら変更できない

直訳すると正則記法?
0202デフォルトの名無しさん
垢版 |
2017/06/16(金) 00:34:50.74ID:PEuGYK32
確かに数学的にはregularは正則でnormalが正規だけども
正規表現が正則式だの正則表現になったからといって何が分かりやすくなるでもなし
0204デフォルトの名無しさん
垢版 |
2017/06/16(金) 03:20:09.01ID:cmFh/xD2
英語圏の人たちにとってもRegular Expressionと言われて
[ \s]* みたいなことか〜て思い浮かぶわけでもなかろ
単に「それを何と呼ぶか」つまり名前付けをどうするってだけのことだよ

ただ日本では(2chだけかもしれないけど)性器表現とか茶々入れる奴がいるのが面倒くさい
0205デフォルトの名無しさん
垢版 |
2017/06/16(金) 06:44:35.89ID:HukDnr5k
2chに限らずゲスな一般大衆の猿共は真っ先に性器と捉える
正規よりかは正則の方が良かっただろうけど
若い女の子へのセクハラに使えるから正規も捨て難い
まあ今時「せいき」の言葉にモジモジする女子なんて希少だが居なくは無い
0210デフォルトの名無しさん
垢版 |
2017/06/16(金) 18:35:19.21ID:1eQLQexT
成基学園ってまだあるんかね
0211デフォルトの名無しさん
垢版 |
2017/06/19(月) 22:55:10.17ID:HM1jnBNt
システム関係の仕事してるけど正規表現知ってるとホント仕事がはかどるわ
知らん奴いたら教えたくないレベルw
0214デフォルトの名無しさん
垢版 |
2017/06/20(火) 12:36:20.94ID:5s5M5H6z
痴漢と挿入
0217デフォルトの名無しさん
垢版 |
2017/06/25(日) 14:01:32.44ID:cBKwT0iz
挿入したら痴漢じゃなくなるからそういうことだな
0218デフォルトの名無しさん
垢版 |
2017/06/25(日) 14:08:45.87ID:cBKwT0iz
質問です。

ttp://hayabusa3.2ch・sc/test/read.cgi/news/1498009569/
↑ここに、「それは文科省にとってリスクか&#12441;あるわけて&#12441;すね。」っていう文章があります。
これをエディタで置換したいです。
秀丸エディタには半角化、全角化があるので、
「&#12441;」を「゛」に、「゛」とその前を半角に、「゙」とその前を全角にと言う手順で全角濁音化することができます。
しかし、段階的に置換すると、[ニダ]と言う文字が[ニダ]となります。
専ブラでなく普通のエディタでメール欄に限定せず「&#12441;」だけをちゃんと全角濁音化するにはどうしたらいいでしょうか。
0219デフォルトの名無しさん
垢版 |
2017/06/25(日) 14:14:01.85ID:cBKwT0iz
変換関数をネストして、全角から直接全角に置換すれば大丈夫っぽいです。
スレ汚し失礼しました。
0221デフォルトの名無しさん
垢版 |
2017/06/25(日) 14:24:13.60ID:cBKwT0iz
マクロを覚えるほど気力ないので。
せいぜいキーボードマクロまでですね。

メモ:
1回目「゙」→「゛」
2回目「[か-こさ-そた-と][゛]」→「\((0,ToHankaku),ToZenkakuHira)」
0223デフォルトの名無しさん
垢版 |
2017/06/25(日) 15:09:28.12ID:cBKwT0iz
ID:fr6XvX0v3

DOSコマンドでいけるよ

【.cmd】 バッチファイルスクリプト %12 【.bat】
http://mevius.2ch.net/test/read.cgi/tech/1489207631/


なんかscに書けなくなった。
認証が延々と出てくる。
0224デフォルトの名無しさん
垢版 |
2017/06/25(日) 15:19:25.37ID:cBKwT0iz
>>222
なるほど。

http://hide.maruo.co.jp/lib/hmconv/normalize101.html
> Unicode正規化を行ないます。
> パラメータとしてNFC、NFD、NFKC、NFKDが指定可能です。

Googlエ
> 合成形に正規化する方法を NFC(Normalization Form Composition)
0225デフォルトの名無しさん
垢版 |
2017/06/29(木) 16:59:45.11ID:02bfNUCV
質問します
●Meryで置換

●対象データ
wwwwwwwa,AAAAA,gawgagaw,fwaf awfaf
n,BBB,gawgagaw,fwaf awfa,fwaaw,fwaaw
rea,CCCC
ae,DD,gawgagaw,fwaf awfaf ,fwaaw

●希望する結果
カンマ2番目の
AAAAA
BBB
CCCC
DD


******
******
******
******
に置換


(?<=,).*?(?=[,\n])
までは考えましたがこれ以上力不足でわかりません よろしくお願いします
0228デフォルトの名無しさん
垢版 |
2017/06/30(金) 03:23:16.33ID:9+Qy2E7i
>>226-227
ありがとうございます 上手くいきました 
使わせていただきます&勉強材料にさせていただきます
0229デフォルトの名無しさん
垢版 |
2017/07/06(木) 20:38:45.39ID:zX6kiHLz
質問です。
●Regular Expressionの使用環境
Java Script

●検索か置換か?
置換

●対象データ
abc:ABCDEFG
def:123456789
ghi:くぁwせdr

●希望する結果
上記のような複数行の文字列があったとして、
"123456789"を取り出すにはどのようにしたら良いでしょうか?
条件としては、行頭の"def"をキーにして、
「defで始まる行の、def:の次の文字から行末まで」を取り出したいです。
よろしくお願い致します。
0231デフォルトの名無しさん
垢版 |
2017/07/08(土) 02:10:34.01ID:OqNCkVph
BBCの正規表現クイズ。たまにはこういうのも面白いね
ttp://www.bbc.co.uk/programmes/articles/5LCB3rN2dWLqsmGMy5KYtBf/puzzle-for-today
0232デフォルトの名無しさん
垢版 |
2017/07/08(土) 06:16:34.80ID:b/20QJ7+
>>230
こういう場合、先読みの方法でやるメリットって有るんですか?
初心者なんで教えて下さい。
0234デフォルトの名無しさん
垢版 |
2017/07/08(土) 09:10:13.00ID:NOOXEVdu
>>232
後読みの部分にはマッチしない

つまり>>229で後読み使った場合には
123456789
にマッチするがそうでない場合は
def:123456789
にマッチする
0235デフォルトの名無しさん
垢版 |
2017/07/08(土) 19:51:13.74ID:utlt5XjQ
後読みの説明はそうなんだけど、>>230 について訊いてるんでしょ?

俺も>>230の意図はよくわからん。行単位の処理を希望してるのにm付けてるし
0238デフォルトの名無しさん
垢版 |
2017/07/15(土) 12:03:12.72ID:6mzqXSAQ
少しやって時間の問題だなと思って途中で切り上げて答見たけど
数文字しか合ってなかった
最後までやらなくてよかった
0239デフォルトの名無しさん
垢版 |
2017/07/25(火) 08:57:23.04ID:QW1aVSBc
●Regular Expressionの使用環境
VBA7.1

●検索か置換か?
検索

●説明
期待する数値の桁数かどうか。拡張子はあっても無くても良い。

●対象データ
AA17-0001.xlsm
AA17-0002

●希望する結果
ifで合致しているかどうかを判定しています。
.Pattern = "^AA\d{2}-\d{4}(\.xlsm$)?"

○AA17-0001.xlsm
○AA17-0002
×AA17-00023
×AA17-00024.xlsm

最後の?を削れば、拡張仕込みであれば上手くいきますが良い方法は
ないでしょうか。
0241デフォルトの名無しさん
垢版 |
2017/07/25(火) 12:00:47.38ID:QW1aVSBc
>>240
有り難うございます!ばっちりです。
$マークを足すだけで良かったんですね。助かりました。
0242デフォルトの名無しさん
垢版 |
2017/07/25(火) 12:23:12.14ID:QW1aVSBc
差し支え無ければ、 ^AA\d{2}-\d{4}(\.xlsm)? だと

ND17-00001
ND17-00001.xlsm2

等々にもマッチしてしまう理由を教えていただけないでしょうか。
0245デフォルトの名無しさん
垢版 |
2017/07/25(火) 13:05:32.38ID:BGzbzmfB
^AA\d{2}-\d{4}(\.xlsm$)?

"^AA\d{2}-\d{4}" と "^AA\d{2}-\d{4}\.xlsm$" という意味
AA17-00001
AA17-00001.xlsm2
の "AA17-0000" の部分に前者がマッチする
"^AA\d{2}-\d{4}$" であればマッチしない
0246デフォルトの名無しさん
垢版 |
2017/07/25(火) 13:22:18.59ID:QW1aVSBc
なるほど。分かりやすく有り難うございます!
だから>>240で期待通りになるんですね。
頭固いと理解するのが大変です。。orz
0247デフォルトの名無しさん
垢版 |
2017/07/25(火) 13:29:36.02ID:oWvKCPb4
?は「直前のパターンが 0回または 1回登場する事」なので、そのパターン中に、$「行末」を含めてしまうと、(0回登場側で)効果が消えてしまう。
1人で書いてるとよくやるミスだと思う。
0248デフォルトの名無しさん
垢版 |
2017/07/25(火) 21:26:32.07ID:lTcbRvTI
^AA\d{2}-\d{4}
は実は
^AA\d{2}-\d{4}.*$
だと考えれば理解の助けになるかも。ならないかも。
0249デフォルトの名無しさん
垢版 |
2017/07/26(水) 01:05:33.15ID:3rtPYRQF
^AA\d{2}-\d{4}(\.xlsm$)?

$?
行末の後ろに、? か。
この式は、見た瞬間に、おかしいとわかる
0251デフォルトの名無しさん
垢版 |
2017/07/26(水) 13:08:28.96ID:9H6h7u80
>>250
文法的には正しいけれど、式としておかしい「と感じる事ができる」と言いたいんだと思う。
0253デフォルトの名無しさん
垢版 |
2017/07/26(水) 14:55:46.30ID:aH2YwDtv
250,252みたいなのをアスペっていうんだろうな
論点は式や文法として正しいか正しくないかではないって事ぐらい一目見れば分かりそうなもんだが
0254デフォルトの名無しさん
垢版 |
2017/07/26(水) 16:41:49.04ID:NnPMbS6q
きちんと整理すると目的に合わない正規表現が直感的に分かるエスパー能力
としか言いようがないし>>249がその能力者だとしても特に羨ましくもない
0255デフォルトの名無しさん
垢版 |
2017/07/26(水) 17:37:15.75ID:UlpW8N7A
例えば、エディタの検索等で強調表示する際の式としてなら何も不思議は無いが
プログラム中での判定式ならば後者は必ず前者にマッチするので意味を成さない
つまり無駄に冗長であったり何かミスをしている可能性が高い。そういう事でしょ
0257デフォルトの名無しさん
垢版 |
2017/07/26(水) 17:52:57.91ID:Bbl5PJto
問題は >>249 が何の役にも立ちそうにないということじゃないかな。
何を言いたいか想像できなくもないが、単に知らないだけという可能性もまた捨てきれない。
ここはそういう場所だ。
明確に「$ は末尾にだけ書くようにすれば間違いを防げると思うよ」とでも書けばよかったのに。
0258デフォルトの名無しさん
垢版 |
2017/07/26(水) 18:26:15.97ID:UlpW8N7A
まあ読点の打ち方とかみるにアホガキか底辺土方がドヤりたかっただけだろうから
そろそろそっとしておいておやり
0260デフォルトの名無しさん
垢版 |
2017/07/26(水) 21:03:00.43ID:JJ3vg08i
>>249は句読点の打ち方からも、おかしいとわかる

発端は正規表現は行を対象にマッチするものという偏見じゃないか
0261デフォルトの名無しさん
垢版 |
2017/07/27(木) 08:25:22.52ID:JB/MQIbV
>>253
もう本来の問題は解決して、間違いを防ぐという話をしているところに >>249 だ。
いかにも頭悪そうだけど何しに来たんだというのが論点じゃないのか?
0264デフォルトの名無しさん
垢版 |
2017/07/27(木) 11:04:39.19ID:w0VKyQmM
そこら辺も含めてプログラマに多いタイプって事だ
話の流れや空気を読むのが苦手なタイプ
0267デフォルトの名無しさん
垢版 |
2017/07/27(木) 19:38:46.83ID:/VCkXAgy
プログラマって話の流れが読めないやつ確かに多い気がするけど、何でなんだろう。
プログラムとかって、流れを理解する事が重要じゃん?
0268デフォルトの名無しさん
垢版 |
2017/07/27(木) 21:11:31.82ID:oiygPPLB
プログラマーとひと口に言ってもピンキリ
使えないキリの方のコミュ障ボッチオタク系IT土方をバカにするネタでそういったのが多いから
そんなイメージが付いてるだけでしょ
業種に依らず底辺のゴミ共に通じるネタだったものが独り歩きしたんじゃない?

まあでも「流れや空気を読む」てのはファジーな判断能力でコミュニケーションの中で培われるから
人間関係よりも数学の方が楽って人には難しく、そういった傾向はあるのかも知れない
0271デフォルトの名無しさん
垢版 |
2017/07/28(金) 11:26:50.45ID:qIgprOUf
sageも知らずに書いてる人って同一人物なんだろうけど
自分が遠回しにディスられてる事にも気付いてなくて可愛い
ある意味幸せか
0272デフォルトの名無しさん
垢版 |
2017/08/12(土) 17:55:36.45ID:cYclCetd
●Regular Expressionの使用環境
Java1.8

●検索か置換か?
検索

●説明
下記の部分を抽出したい
AV0bc-t3.jpg
B32bc4f.jpg

●対象データ(一部)
風景-20170503-AV0bc-t3.jpg
b5-two-mountain-B32bc4f.jpg


最初は-を区切りとして抽出できるかと思ったが
抽出対象の文字列にも-が登場することが判明して為万事休す状態です。
どうかご指導お願い致します。
0273272
垢版 |
2017/08/12(土) 18:05:09.95ID:cYclCetd
>>272です
すいません。これどう考えても不可能ですね。
-ファイルについては手動でやってその他は正規表現で対応します。
失礼しました。
0275デフォルトの名無しさん
垢版 |
2017/08/12(土) 21:05:50.58ID:wIgCsZkA
>>272
誤爆前提
(?<=\-)([A-Za-z\d]+\-?[A-Za-z\d]{0,3}\.jpg)(?=(?:\n|$))

[A-Za-z\d]{0,3}部の構成次第か?
まあ全部手でやるよりかはマシになるような気がする
0276272
垢版 |
2017/08/12(土) 22:50:49.75ID:cYclCetd
>>275
ありがとうございます!!
まじで神です!相談して良かったです。
こういう人がお金をもらえる世の中になってほしいです。
本当に感謝します。あなたは誰よりも優しいです。
無償で人の為にがんばる人は本当に尊敬します!!
ありがとうございました!!
0277デフォルトの名無しさん
垢版 |
2017/08/12(土) 23:11:24.65ID:U/tP6VJk
該当文字列長の幅が決まっているなら{6,8}の数字を調整すればこれでいけるはず
(?<=-)[-A-Za-z\d]{6,8}\.jpg
0278デフォルトの名無しさん
垢版 |
2017/08/13(日) 03:23:49.05ID:SYaWjJhn
ファイル名には、半角英数字の他、「- _ .」と半角空白も、考慮しろ

こういうファイル名もある

a.txt.zip
0280デフォルトの名無しさん
垢版 |
2017/08/13(日) 19:47:39.02ID:BX+CBZkv
2chのNGで、「URLが含まれる文章を除いた行が5つ以上あるレスをNG」という表記を作ることは可能ですか?
0283デフォルトの名無しさん
垢版 |
2017/08/14(月) 03:10:00.43ID:FrfucSX4
>>281
前提
@正規表現を使い、2chのNG設定を行いたい
A専門板での長文荒らしをNGしたい
BURLが貼られたレスは長文であってもNGにしたくない
以上から、「URLが含まれる文章を除いた行が5つ以上あるレスをNG」をしたいです
この表記を作ることは可能ですか?
0284デフォルトの名無しさん
垢版 |
2017/08/14(月) 03:17:09.39ID:FrfucSX4
URLの定義を以下のようにしました
://([a-zA-Z0-9_/:;%#\$&\?\(\)~\.=\+\-])*
(://の後に英数字とURLに使われる記号が続く文字列)
これを[^]で括って否定にした後、任意の行数以上含まれるレスのNGをするという方向性で考えています
0285デフォルトの名無しさん
垢版 |
2017/08/14(月) 16:30:05.91ID:yxoqAlkZ
^が否定と 先頭の2つの意味を持っていて
$ が 末尾と $1 $2 などのインデックスの意味を持っているとか
メタ文字の効果が重複しているのが混乱します。
どうすればいいですか?
0287デフォルトの名無しさん
垢版 |
2017/08/14(月) 18:31:02.14ID:89kehc6V
Jane StyleでIDなしのレスだけ抽出するにはどうしたらよろしいでしょうか?
IDなしをNGにする方法はいくらでも出てくるのですが・・・
0289デフォルトの名無しさん
垢版 |
2017/08/14(月) 20:33:03.02ID:89kehc6V
>>288
浪人あればID消せるんじゃなかったっけ?
ID表示スレでも?

たまに見かけるんだけど、
じゃあ、どのスレ?と聞かれてもなかなか見つからない。

すいません、見つかるまでお待ち下さい・・・
0292デフォルトの名無しさん
垢版 |
2017/08/14(月) 20:59:49.60ID:89kehc6V
>>291
すみません。今のところ該当スレが見つかりません。

目的としては、
優良エロ画像スレでたまにIDなしでグロ画像を貼る輩がいて、
IDなしのレスがほぼグロ画像ならIDなしをNGにするし、
IDなしでも優良エロ画像を貼ってくれてるならIDなしでもNGしないし・・・

という恥ずかしい理由なんです
0295デフォルトの名無しさん
垢版 |
2017/08/21(月) 19:05:01.74ID:ToOu4wDd
よろしければアドバイスください

●Regular Expressionの使用環境
正規表現で検索できるテキストエディタ

●検索か置換か?
検索

●説明
アンド検索で一つ目にマッチした文字列からn行以内にある二つ目の文字列までを抽出したい

●対象データ
林檎みかんバナナ
みかん林檎バナナ
林檎キウイみかん
バナナ林檎みかん
メロン林檎バナナ
メロンみかん林檎
みかんバナナ林檎
林檎みかんキウイ
林檎バナナみかん

●希望する結果
みかんバナナ
みかん林檎バナナ
林檎キウイ
0296295
垢版 |
2017/08/21(月) 19:05:58.56ID:ToOu4wDd
>>295の質問のつづきです

●自分で試したこと
今回は三行以内に「みかん」と「キウイ」の二つの文字列を含む部分 だけ を抽出したい
記述は以下のように書いてみたが、四行以上にまたがってマッチした部分まで抽出されてしまった

みかん([¥s¥S]*?)キウイ

●自分で試した検索ワード
「正規表現 複数行 文字列 検索 -秀丸」の組み合わせをいくつか試した
検索結果からプログラマーの質問回答サイトに飛んで似たように検索するも欲しい回答は見つからず
0297デフォルトの名無しさん
垢版 |
2017/08/21(月) 21:48:45.68ID:EQVEvxNp
n行なら可能だけどn行以内ってのは無理だと思う
つまり
1行の式|2行の式|…|n行の式
と書くしかないんじゃないかな
0298295
垢版 |
2017/08/21(月) 22:44:09.38ID:ToOu4wDd
そうですか
やはり ([¥s¥S]*?) を使うのが間違ってますよね?

レスありがとうございます
0299デフォルトの名無しさん
垢版 |
2017/08/21(月) 23:09:35.41ID:7hohe37q
/みかん¥S*?¥n??¥S*?¥n??¥S*?キウイ/g
とか
/みかん(?:¥S*¥n?){0,2}¥S*キウイ/g
とかかな

1~3行目と6~8行目のみかん〜キウイがマッチする
0300デフォルトの名無しさん
垢版 |
2017/08/23(水) 21:18:57.34ID:a8dh4txw
>>296

秀丸の正規表現はしらないので一般的な正規表現で考えてみた。
試していないので間違っているかもしれないが。

みかん(.*¥n){1,3}?.*キウイ
0303デフォルトの名無しさん
垢版 |
2017/08/24(木) 22:00:31.43ID:vZuGMV9A
できたよ

コピペしたときバックスラッシュが別の文字に変わっていたので、
そこだけ入力し直したけど
0304デフォルトの名無しさん
垢版 |
2017/10/02(月) 15:17:50.91ID:uet6lO9o
二文字以上連続していない場合のみヒットする正規表現はどう書けばいいですか?
aを探すとして
"abc"のaはヒットする
"aabc"のaaは連続しているのでヒットしない
ということをしたいです
0306デフォルトの名無しさん
垢版 |
2017/10/02(月) 15:50:22.85ID:oE42sBRL
aで固定って訳じゃなくて
bだけとかcだけとかも探したいのでは?
0308デフォルトの名無しさん
垢版 |
2017/10/02(月) 17:40:05.25ID:G/SyJC6m
単に見つけるだけなら
/(.)(?!\1)(.)(?!\2)/
で出来なくもない。
しかし、見つかったときは2文字マッチするパターンなので
全部見つけたい場合はそこを考慮する必要がある。
先頭の文字は見つけられないから別途
/^(.)(?!\1)/
のようにする必要があるだろう。
言語によってはもっとうまくできるかもしれない。
でも、for 文とかで探す方がいいと思うよ。
0309デフォルトの名無しさん
垢版 |
2017/10/02(月) 18:33:11.59ID:G/SyJC6m
/(.)(\1)*/
でマッチした長さが 1 だったらという考え方も出来るけど、どう?
0311デフォルトの名無しさん
垢版 |
2017/10/11(水) 15:02:29.43ID:PTqhQudL
ユニコード文字プロパティから
特定の文字のみを除外した文字の集合を
簡単に書く方法はあるでしょうか?

例えば \p{C} からタブ(\t)と改行コード(\n|\r)のみ除外したもの
0312デフォルトの名無しさん
垢版 |
2017/10/12(木) 22:03:36.05ID:iUceZ3nS
>>311
(?![\n\r])\p{C}
0313デフォルトの名無しさん
垢版 |
2017/10/14(土) 07:42:21.07ID:sv7zl76d
「"」以外の文字にマッチするが「\"」ならそれにもマッチする
ってどう書けばいいですか?
0314デフォルトの名無しさん
垢版 |
2017/10/14(土) 08:04:06.86ID:Wo1S3xrN
>>313
([^"]|(?<=\\)")
0316デフォルトの名無しさん
垢版 |
2017/10/14(土) 12:04:18.44ID:SVCVJk+z
正規表現を再利用したくて調べたんだができないんだな
itemcode:=/(S|T|U)\d{3}-\d{4}/
/^\s*\{itemcode}\s*$/
こういう仕様あっても全然いいと思うんだが仕様策定団体がサボったのか
0317デフォルトの名無しさん
垢版 |
2017/10/14(土) 12:19:47.01ID:2Glba8SI
言語やエディタの機能で補完すれば?
変数に正規表現リテラルを格納して後で使えるようにするのは正規表現の枠をこえてる
0318デフォルトの名無しさん
垢版 |
2017/10/14(土) 13:45:15.89ID:m/q/3Rhj
>>316
そもそも正規表現の規格の枠外やん
Perlなら

my $itemcode = q/(S|T|U)\d{3}-\d{4}/;
my $regex = qq/^\s*{$itemcode}\s*$/;

$target =~ /$regex/;

とか出来たと思うが, $itemcodeも$regexも単に文字列だしな
0319デフォルトの名無しさん
垢版 |
2017/10/14(土) 20:25:03.69ID:nyEdEfPd
>>316
環境によるが、pcreを使っているプログラムなら、
(?(DEFINE)(?<name>pattern)...)で定義して(?&name)で使える。つまり、
/(?(DEFINE)(?<itemcode>(S|T|U)\d{3}-\d{4}))^\s*(?&itemcode)\s*$/
0321デフォルトの名無しさん
垢版 |
2017/10/15(日) 23:07:27.13ID:/4ZFGRZX
後方参照っどこが後方やねん、後方で参照してるってことか?
と思っていたのですが、
左から右へと文字列を舐めていくカーソルの立場から見て後ろ、
という意味ですね?
0324デフォルトの名無しさん
垢版 |
2017/10/16(月) 16:17:56.84ID:BvwEZWNg
PCRE_EXTENDEDの説明に
この修飾子を設定すると、エスケープするか 文字クラスの内部を除き、
パターンの空白文字は完全に無視されます。
とありますが、
これはどういう時に使うのでしょうか?
空白文字を無視したいなら
最初からパターンに含めなければいいだけのような気がするのですが・・
0327デフォルトの名無しさん
垢版 |
2017/10/18(水) 00:44:52.51ID:HJHK1SNa
[$]

こういう文字クラスがあった場合、これは終端と解釈されますか?
それとも文字列の$と解釈されますか?

また、[\$] だった場合は挙動が変化しますか?
0330デフォルトの名無しさん
垢版 |
2017/10/20(金) 00:50:10.62ID:hFePCOoH
過去にAutohotkeyスレで正規表現自体の質問は正規表現スレに行けとあったのでこちらで質問させて下さい(巻き添えアク禁でソフトウェア板に書き込めません)。宜しくお願いします。

●Regular Expressionの使用環境
wikiより引用
>AutoHotkeyで用意されている正規表現は、Perl 5に搭載されているものと概ね互換のPCRE(Perl Compatible Regular Expressions)である

●検索か置換か?
検索

●説明
順不同の単語群のすべてを含む文字列の最長を検索し取り出したいです

●対象データ
var := "クリスマス任意の文字列お盆任意の文字列正月任意の文字列"
pos := RegExMatch(var, "s)^(?=.*?お?盆)(?=.*?クリスマス)(?=.*?正月)", $)
MsgBox, pos=%pos% $=%$%
s)の意味はシングルラインモード
posはマッチした位置
$にはマッチした全体が入ります

これですと先頭の"位置"にマッチ(pos=1になります)するのでマッチした全体$は空になってしまいます

●希望する結果
$=クリスマス任意の文字列お盆任意の文字列正月
実際は長文の一部で単語群がもっと多いです
どの文字が先頭でどの文字が最後か不明のとき、これらの単語群がすべて含まれる文字列全体を取り出すにはどのように書いたら良いでしょうか

(クリスマス|お盆|正月).+(?1)
これですと正月という単語が含まれなくてもマッチしてしまいます
0331デフォルトの名無しさん
垢版 |
2017/10/20(金) 02:08:00.45ID:yLtxI7rs
>>330
>これらの単語群がすべて含まれる文字列全体を取り出すには

これらの単語群って、クリスマス・お盆・正月の3単語を指してるのかな?
それならダサいけど(クリスマス|お盆|正月)を3回繰り返せば?
https://regex101.com/r/yRw8ob/1
0332デフォルトの名無しさん
垢版 |
2017/10/20(金) 02:42:11.40ID:GaFTw98F
>>330
その2を組み合わせればいいじゃん
/(?=.*クリスマス)(?=.*お?盆)(?=.*正月)(?:クリスマス|お?盆|正月).*(?:クリスマス|お?盆|正月)/
0333デフォルトの名無しさん
垢版 |
2017/10/20(金) 19:27:41.06ID:P/1hvwmS
2ch → 5chになったタイミングでアク禁って全解除されたと思うけど、また規制され始めたのかな?
0335デフォルトの名無しさん
垢版 |
2017/10/20(金) 20:01:26.36ID:GaFTw98F
アク禁は知らんけど、おπ規制だけは5chでは2chのを引き継いでないってことは言われてた
0336330
垢版 |
2017/10/20(金) 20:06:35.04ID:JiGfFRv1
>>331
すみませんでした
(クリスマス|お盆|正月)の3つの単語を全て含む文字列の最長マッチと書くべきでした
(クリスマス|お盆|正月).*?(クリスマス|お盆|正月).*?(クリスマス|お盆|正月)
では最長3単語まででお盆という単語を含まなくてもマッチしてしまいます

>>332
>その2
というのが何をさすのかすみません分かりませんでした
var := "クリスマス任意の文字列お盆任意の文字列正月任意の文字列お盆任意の文字列正月任意の文字列クリスマスzzzz盆zzzzz盆zzzzzzz盆zzzzzzzzzzzお盆"
pos := RegExMatch(var, "s)(?=.*?お?盆)(?=.*?クリスマス)(?=.*?正月)(?:お?盆|クリスマス|正月).*(?:お?盆|クリスマス|正月)", $)
MsgBox,,, pos%pos% %$%, ;マッチ $=var全体
pos := RegExMatch(var, "s)^(?=.*?お?盆)(?=.*?クリスマス)(?=.*?正月)(?:お?盆|クリスマス|正月).*(?:お?盆|クリスマス|正月)", $)
MsgBox,,, pos%pos% %$%, ;行頭^記号ありでもマッチしました $=var全体

これでお盆が含まなければマッチせず、全ての単語が含まれるとき期待通りになりました。有難うございました

ただ、対象文字列の1文字目が(クリスマス|お盆|正月)以外で始まるケースではマッチしませんでした
最初に書いたこれなら1文字目を問わずマッチするのですがやはり全体が拾えず……。
pos := RegExMatch(var, "s)^(?=.*?お?盆)(?=.*?クリスマス)(?=.*?正月)", $)

var := RegExReplace(var, "^.*?(?=クリスマス|お?盆|正月)", "")
のように1文字目が必ず指定した単語のどれかになるように修正してから使わせていただきます
お世話になりました。
0338デフォルトの名無しさん
垢版 |
2017/10/20(金) 20:23:53.34ID:JiGfFRv1
pos := RegExMatch(var, "s).*?((?=.*?お?盆)(?=.*?クリスマス)(?=.*?正月)(?:お?盆|クリスマス|正月).*(?:お?盆|クリスマス|正月))", $)
MsgBox, %$1%
すみませんこれで1文字目不問で取り出せました
長文失礼しました
0339デフォルトの名無しさん
垢版 |
2017/10/20(金) 20:27:40.74ID:GaFTw98F
何がしたいの?
>>332で要求する最長文字列を取れるはずだけど?
マッチ全体がそうなるようにしてるんだから
それとも部分キャプチャで取りたかったんなら全体を()で括るだけでいいよ
0340デフォルトの名無しさん
垢版 |
2017/10/20(金) 20:41:25.29ID:JiGfFRv1
説明下手ですみません
var := "zzあzzzいzzzうzzzうzzあzzいzz"
最初に見つかる(あ|い|う)のどれかから
最後に見つかる(あ|い|う)のどれかまで
かつ(あ|い|う)すべての語が含まれる文字列を取り出したかった
アク禁じゃなくスマホ回線だからかも知れません
0342デフォルトの名無しさん
垢版 |
2017/10/21(土) 00:17:18.52ID:jXM7J8Fl
こういうのはどうかな

(?=.*クリスマス)(?=.*お盆)(?=.*正月)(?:クリスマス|お盆|正月).*(?:クリスマス|お盆|正月)
0344デフォルトの名無しさん
垢版 |
2017/10/21(土) 00:33:00.59ID:ZBz0JWdz
**クリスマス**クリスマス**正月**お盆**お盆**
だったら最初と最後の**を抜かして
クリスマス**クリスマス**正月**お盆**お盆
にマッチさせたいって話なの?


あとシングルラインモード使ってるから
複数行にわたってマッチさせたいんだよね?
↓こういうの

**クリスマス**
**クリスマス**正月**
**正月**お盆**
0346338
垢版 |
2017/10/21(土) 02:32:45.68ID:o7hEIA7f
>>342,343
AutoHotkey v1.1.26.01(最新) Unicode版ですがやはり先頭が別の文字列だとマッチしません

var := "zzzクリスマス任意の文字列お盆任意の文字列正月任意の文字列お盆任意の文字列正月任意の文字列クリスマスzzzz盆zzzzz盆zzzzzzz盆zzzzzzzzzzzお盆"
pos := RegExMatch(var, "s)(?=.*?お?盆)(?=.*?クリスマス)(?=.*?正月)(?:お?盆|クリスマス|正月).*(?:お?盆|クリスマス|正月)", $)
MsgBox,,, pos%pos% %$%, ;pos=0 マッチしません

>>338の正規表現ならpos=1で最初に見つかるクリスマスから最後の盆まで取り出せました

>>344
その通りです>>340より分かりやすい説明が思いつきません
0347デフォルトの名無しさん
垢版 |
2017/10/21(土) 12:04:21.32ID:Awu3DWjD
"s)(?=((お?+盆)|(クリスマス)|(正月)))(?=.*(?2))(?=.*(?3))(?=.*(?4)).*(?1)"

>>346
気持ち悪いから試してみた
"s)(?=盆)盆"→マッチする
"s)(?=.*?盆)盆"→マッチしない←?!?!
"s).(?=.*?盆)盆"→する
"s)(?=.)(?=.*?盆)盆"→する
"s)(?:)(?=.*?盆)盆"→する

s)と(?=.*の間に何かを挿めば何故か回避できそう?
"s)(?:)(?=.*?お?盆)(?=.*?クリスマス)(?=.*?正月)(?:お?盆|クリスマス|正月).*(?:お?盆|クリスマス|正月)"
0348338
垢版 |
2017/10/21(土) 17:14:22.52ID:o7hEIA7f
>>347
すごい!>>346のvar文字列に対しpos=4で最も理想的な形でとれました!
pos := RegExMatch(var, "s)(?=((お?+盆)|(クリスマス)|(正月)))(?=.*(?2))(?=.*(?3))(?=.*(?4)).*(?1)", $)
MsgBox,,, pos%pos% %$%, ;pos=4 $=最初のクリスマスから最後の盆

s)^(?=.*?お?盆)(?=.*?クリスマス)(?=.*?正月)
この正規表現の出所はスマホアプリ板2chmate質問スレのテンプレにあるNGワードで
2chmateのシングルラインモードは(?s:ここに正規表現)と書くようです
その辺のやりとりが過去スレ
http://itest.5ch.net/potato/test/read.cgi/applism/1474912259/893-n
にありました

>893
>複数のワードを全て含む書き込みをNG
>(?s:^(?=.*ワード1)(?=.*ワード2)(?=.*ワード3))
>これがどうしても分からん(なぜワードの順番を入れ換えてもマッチするのか)
>
>895
>ワード1を先読みしてそれを含む^にマッチ
>ワード2を先読みしてそれを含む^(?=.*ワード1)にマッチ
>ワード3を先読みしてそれを含む^(?=.*ワード1)(?=.*ワード2)にマッチ
>
>896
>例えば「(先頭)あいうえお」という文字列に^(?=.*うえお)でサーチかける場合
>^(?=.*うえお)は「.*うえお」が続く^のみにマッチするから「うえお」を含む「(先頭)」にマッチ
>つまりこれを何度やっても^に戻ってくる
>で、先読みがどこかで失敗したらそこで成立しなくなるというカラクリ
0349338
垢版 |
2017/10/21(土) 17:15:24.33ID:o7hEIA7f
s).*?((?=.*?お?盆)(?=.*?クリスマス)(?=.*?正月)(?:お?盆|クリスマス|正月).*(?:お?盆|クリスマス|正月))
AutoHotkeyシングルラインモードでは正規表現の先頭に「^」が有っても無くても先頭からマッチするので
.*?(?=.*?お?盆)(?=.*?クリスマス)(?=.*?正月) ;<----ここで先頭にマッチ(1)
(?:お?盆|クリスマス|正月) ;<----先頭に続く最初に見つかる(?:お?盆|クリスマス|正月)のどれかにマッチ(2)
.*(?:お?盆|クリスマス|正月) ;<----(2)に続く最後に見つかる(?:お?盆|クリスマス|正月)のどれかにマッチ(3)となるようです
s)と(?=.*?の間に最短0文字表現を入れないとマッチしないのはもしかしてバグなんでしょうかね
0350デフォルトの名無しさん
垢版 |
2017/10/24(火) 15:16:03.89ID:5n0ye5v7
すみません。
自分で書いた正規表現が期待通り動いたのですが理由が分かりません。
どなたか解説お願いします。

Notepad++の置換で、こんなデータに対して

<abcde> <hijk>
<abc> <XYZ>
<dfg>

検索文字列 (?:\s*<([^<>]*)>)?\s*<([^<>]*)>
置換文字列 [$1]\t[$2]\r\n
で置換して、結果がこうなりました。

[abcde] [hijk]
[abc] [XYZ]
[] [dfg]

この三行目の動作なんですが、一行に一個しかデータが無い場合には、二番目のデータとしてキャプチャしたかったので
この動きで良いのですが、なぜこれが出来たのが分かりません。
検索文字列の一つ目の丸カッコの (?:・・・)? <== この量指定子?がそう言う動作になるのでしょうか?
そうだとしたら、なぜそうなるのでしょうか?
あるいはもっと簡潔なパターンはありますか?
宜しくお願い致します。
0351デフォルトの名無しさん
垢版 |
2017/10/24(火) 15:43:41.40ID:JVoqQJo1
$1と$2が存在するという前提で置換しておきながら$1は?で消えるかもと指定してるから
$1が無いパターンにマッチしたと判断された(適当)
0352デフォルトの名無しさん
垢版 |
2017/12/01(金) 00:01:15.16ID:J9gYbH6z
Spam Mail Killerの正規表現についてすみませんがご教示ください。

メールアドレスに同じドメインのアドレスを複数(たとえば3個以上)含む、という場合
例えばですが
abc@uvw-xyz.com, defg123@uvw-xyz.com, hi456@uvw-xyz.com
このようなアドレスをひとくくりに探し出すにはどのようにすればいいでしょうか?
##/(?=.*@uvy-xyz\.com){3,}/km
とやってみましたがうまく動きませんでした。
正規表現って難しい・・・
0354デフォルトの名無しさん
垢版 |
2017/12/01(金) 00:37:36.11ID:J9gYbH6z
>>353
ありがとうございます。
対象アドレスが2つでも反応してしまいました(´・ω・`;)何故だー
0355デフォルトの名無しさん
垢版 |
2017/12/01(金) 01:38:11.93ID:4kQewCo+
([\w\d._-]+?@uvw-xyz\.com, ){2,}[\w\d._-]+?@uvw-xyz\.com
冗長だけど、とりあえずこれならどのアプリでも動くはず
0356352
垢版 |
2017/12/01(金) 03:23:10.36ID:J9gYbH6z
>>355
ありがとうござます。ばっちりでした。
ひとまずはこれで運用してみようと思います。
0357デフォルトの名無しさん
垢版 |
2017/12/01(金) 14:56:42.38ID:GNYmtVXo
([\w\d._-]+?@uvw-xyz\.com(,\s?)?){3,}
メールアドレスに注目するなら、これでもいいかな
0358デフォルトの名無しさん
垢版 |
2017/12/01(金) 15:03:45.52ID:GNYmtVXo
スペースのパターンも考慮すると、こちらのほうがいいかも
([\w\d._-]+?@uvw-xyz\.com(,\s*)?){3,}
0359デフォルトの名無しさん
垢版 |
2017/12/01(金) 19:07:13.56ID:lDYRmGG1
拘り始めるときりがない
複数の記述方法があるしそれで制限も変わる
https://ja.m.wikipedia.org/wiki/%E3%83%A1%E3%83%BC%E3%83%AB%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9

軽く「正規表現 メールアドレス」でググればメールアドレスを糞まじめに正規表現で頑張る意味がないのが頭の5個も読めば理解できるでしょ
依頼者がとりあえず解決したと言ってるんだからこれ以上は現状不要だよ
0360352
垢版 |
2017/12/01(金) 23:13:24.55ID:J9gYbH6z
みなさんありがとうございました。
書き方も拘りだしたらきりが無いというのはよくわかりました。
記述がすっきりしていて動作も問題なかったので >>358 の方法でいってみます。
0361デフォルトの名無しさん
垢版 |
2017/12/02(土) 07:41:29.80ID:dQK/O/Fy
>>359
最初に与えられた条件の中で、単に冗長な表現をシンプルにすることは、
限界事例を前提するような拘りというのとは違うと思うけどな。
0362デフォルトの名無しさん
垢版 |
2017/12/02(土) 09:41:49.64ID:mi+Z/zsa
>>360
横槍だけど358は最初に与えられた条件(3回出現)と違って3回“連続”出現だから留意してね
そして\wは\d_を含んでいるからまだ冗長だ、ついでに+?の?も{3,}の,もシンプルじゃないね
最初の質問の=を:にするだけでよかったと思うよ

^(?>.*?@uvy-xyz\.com){3}
0364デフォルトの名無しさん
垢版 |
2017/12/02(土) 10:49:44.12ID:SQFbqxvb
正規表現の難しいところは引き際。いろんな意味で。
0365デフォルトの名無しさん
垢版 |
2017/12/02(土) 20:04:53.17ID:aLfswfyL
質問がメインのスレじゃないんだから、
探究することは悪いことじゃないよ。
0366デフォルトの名無しさん
垢版 |
2017/12/02(土) 20:22:17.17ID:P9eUjlcX
なにいってんだこいつ?

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

2 質問テンプレ
0368デフォルトの名無しさん
垢版 |
2017/12/02(土) 22:11:28.09ID:oKFwf0E4
ほとんど質問がルートのレスツリーばかり
テンプレも質問がらみばかり
引き際誤るとここまで人はみっともなくなれるのか
0372デフォルトの名無しさん
垢版 |
2017/12/10(日) 17:27:12.44ID:UOQUQi73
どこまでやりましたか
0373デフォルトの名無しさん
垢版 |
2017/12/10(日) 18:40:59.63ID:DxswVEqC
あとは正規表現のとこだけです。

<tr>
<td class="center">12/08</td>
<td class="center">169</td>
<td class="center">17</td>
<td class="center"> </td>
<td class="center">26</td>
</tr>
0375デフォルトの名無しさん
垢版 |
2017/12/11(月) 01:01:11.97ID:06if4WxO
>>373
正規表現よりHTMLパーサ使えってのは>>373に同意するがjQueryは外部HTMLをパース/操作するものではない

ttps://sites.google.com/site/scriptsexamples/learn-by-example/parsing-html
この辺参考にするのがいいんじゃない
0377デフォルトの名無しさん
垢版 |
2017/12/11(月) 09:34:01.52ID:78kXJ+6a
すぐできるだろうと思って泥沼にハマることが多いわ、こりだすとキリがないわで、あきらめどころが難しいのが正規表現。

自分の中で制限時間(10分など。忙しさによる)を設けて、
それ以上時間がかかる場合は正規表現による解決するのをあきらめるってのが、運用上は合理的だろうね。
正規表現そのものの学習・調査をしたい場合は、もちろん違うが。
このスレの客層はどっちなのってことなのかな。
0380デフォルトの名無しさん
垢版 |
2017/12/14(木) 17:08:16.97ID:lv6L9acp
Perl互換ですが,
ファイルの先頭から末尾までをマッチさせる,つまりファイルのテキストを全部取得するにはどう書いたらいいのでしょうか?
0382デフォルトの名無しさん
垢版 |
2017/12/16(土) 03:31:44.42ID:ArLhqftT
正規表現は構文解析器(parser)じゃないから、
XML, HTML のように、文書に構造があるものは解析できない。バグる

例えば、コメント部に、
<td
と書かれていても、正規表現では該当してしまう

それに要素間に、祖先・子孫などの関係があって、入れ子構造になるから、
開始・終了タグが一致しない
0384デフォルトの名無しさん
垢版 |
2017/12/18(月) 23:20:44.39ID:LMSHu3dl
正規表現でできることできないことの見極めが難しい。
うまくできない原因が、自分の未熟によるものか、そもそも誰がやろうが無理なのか、という見極め。
これは正規表現に限った話でないが、正規表現を使っていると遭遇することが非常に多い。
0386デフォルトの名無しさん
垢版 |
2017/12/25(月) 17:59:18.23ID:9hKP95Nk
もはや姓のサイトウ(斉藤、齊藤など)に適した検索方法って正規表現ぐらいじゃね?


プレス発表 「文字情報基盤整備事業」で推進していた漢字6万文字の国際規格化が完了:IPA 独立行政法人 情報処理推進機構
https://www.ipa.go.jp/about/press/20171225.html
0387デフォルトの名無しさん
垢版 |
2017/12/25(月) 18:01:37.66ID:9hKP95Nk
というか外字だとマルチプラットホーム対応した検索アルゴリズムを作ることが困難だったので、国際規格化されただけまだマシか。
0389デフォルトの名無しさん
垢版 |
2018/01/02(火) 13:30:58.99ID:bFwGimBi
新年おめでとうございます

スマホアプリで正規表現を使いたくて調べたレベルで恐縮です
'\s'は空白文字だそうですが半角スペースのみを表現できないでしょうか?
また'/'を用いて半角スペースを表す方法はありませんでしょうか?
宜しくお願い致します
0392デフォルトの名無しさん
垢版 |
2018/01/06(土) 20:03:46.61ID:eEPcZWZO
社外に情報を持ち出せず脳内再生ですみませんが、
以下の抽出条件を教えてください

●Regular Expressionの使用環境
Excel/VBAの参照設定で5.5

C#からのソースを移植中に、
Executeメソッドで(おそらく後読みができず)エラーとなっているが、
正規表現初心者で手も足も出ず…

●検索か置換か?
検索

●説明
複数行の
任意のホワイトスペースhostname: 後の文字列を検索し、
直後のドメイン名を取得したい。ただし、IPアドレスは除外したい。

●対象データ
hostname: hogehoge.com改行
hostname: mogemoge.com改行
hostname: 192.168.1.1改行

●希望する結果
hogehoge.com
mogemoge.com

よろしくお願いします。
0393デフォルトの名無しさん
垢版 |
2018/01/06(土) 20:08:09.69ID:eEPcZWZO
●対象データ
△△hostname:△hogehoge.com改行
△△△△hostname:△mogemoge.com改行
△hostname:△192.168.1.1改行

のようにスペースが入っています。

Janeでカキコするとスペースが消えたので補足します。
0394デフォルトの名無しさん
垢版 |
2018/01/06(土) 21:13:44.07ID:RuMnMvof
ホスト名の条件が分からんからドメイン名と同等と仮定する
マルチラインモードで

^\s*(?:[A-Za-z](?:[A-Za-z0-9\-]{0,61}[A-Za-z0-9])?\.)*[A-Za-z](?:[A-Za-z0-9\-]{0,61}[A-Za-z0-9])?:[^\S\x0A\x0D]*((?:[A-Za-z](?:[A-Za-z0-9\-]{0,61}[A-Za-z0-9])?\.)*[A-Za-z](?:[A-Za-z0-9\-]{0,61}[A-Za-z0-9])?)$

としてグループ1のキャプチャを見る, とか
つうかVBAなら正規表現で頑張るより改行文字と:でそれぞれsplitしてループ回しながらtrimするのが自然だと思うけど
0395デフォルトの名無しさん
垢版 |
2018/01/06(土) 22:13:51.90ID:eEPcZWZO
>>394
なるほど、hostnameを検索して後読みするのではなく、
ドメインで合致させつつ、IPアドレスを除外するというわけですね。

理解のために改行してみました。
^\s*
(?:[A-Za-z](?:[A-Za-z0-9\-]{0,61}[A-Za-z0-9])?\.)*[A-Za-z](?:[A-Za-z0-9\-]{0,61}[A-Za-z0-9])
?:[^\S\x0A\x0D]
*(
(?:[A-Za-z](?:[A-Za-z0-9\-]{0,61}[A-Za-z0-9])?\.)*[A-Za-z](?:[A-Za-z0-9\-]{0,61}[A-Za-z0-9])
?)$
のうち、
[A-Za-z](?:[A-Za-z0-9\-]{0,61}[A-Za-z0-9])?\.)*[A-Za-z](?:[A-Za-z0-9\-]{0,61}[A-Za-z0-9])
がドメイン、
[^\S\x0A\x0D]
がIPアドレス除外ですね。

私もVBAならInstrとMIDを駆使したほうが可読性も生産性も上がると思うのですが、
過去のC#とPerlの正規表現コードを再利用しつつ、将来的にはPythonとかにも応用できるように
正規表現でがんばれ、との指示を受けたのですが、
いきなりVBAでは後読みできないとか、まわりに有識者のいない罠にはまり難儀しています。
0396デフォルトの名無しさん
垢版 |
2018/01/06(土) 22:25:41.73ID:RuMnMvof
> がIPアドレス除外ですね
違う
\Sは空白文字以外だから[^\S\x0A\x0D]は空白文字以外とCR, LFの「何れでもない」場合, つまり空白文字からCRとLFを除外したもの
そもそも(先頭が英字でなければならない)ドメイン名でマッチングしてるんだから先頭が数字で始まるIPアドレスを後から除外する必要はない

再利用性に関しても, 後読み出来るエンジンかそうでないかで既に失われてるんじゃないかね
キャプチャの取得方法なんぞ言語ごとに大分違うしな

仕事で使うなら尚更メンテし辛い上に遅い正規表現を使わにゃならん積極的理由は無い
splitでループ回せば入力のサイズに対して線型時間で終わることが保証される上に保守性も高い
0398デフォルトの名無しさん
垢版 |
2018/01/10(水) 23:41:51.90ID:qa5Jh8Cf
>>397
現仕様だとまさにIP除外なんだけど、123.comとかが入ってくるので、あとで除外しているという。。

>>396
今日、やっと開発場所で試しました。
ドメインは見事マッチしました!が、
△△domain:△hogehoge.com改行
の行までマッチしてしまうので、
^\s*
(?:[A-Za-z]〜
のところを
^\shostname:*
(?:[A-Za-z]〜
にしてみましたが、今度はすべてマッチしなくなりました。
スペース連続shostname:*を除外したつもりなんですが…教えてくだされ。
0399デフォルトの名無しさん
垢版 |
2018/01/11(木) 10:30:10.40ID:Xo4biI2J
^[△]*hostname:[△]*([0-9.]*[A-Za-z\-][0-9A-Za-z.\-]*)$
^[△]*hostname:[△]*([0-9.]*[^\s0-9.]\S*)$

hostname:△mevius.5ch.net
hostname:△86886.jp
hostname:△日本語.jp
hostname:△はじめよう.みんな
0400デフォルトの名無しさん
垢版 |
2018/01/11(木) 12:30:44.58ID:/99JjIqr
>>398
要件は満たしたつもりだが, その行がマッチしちゃならん理由は?
それともキャプチャの意味が分かってないのか?
0401デフォルトの名無しさん
垢版 |
2018/01/11(木) 13:56:21.29ID:/99JjIqr
>>398
あと申し訳ないけど, 正規表現を全く理解してないよね?
何でその書き換えで除外出来たと思ったのか教えてくれる?
0402デフォルトの名無しさん
垢版 |
2018/01/11(木) 17:51:18.77ID:WzsJRajU
あぁ, hostnameは固定文字列なのか
なら

^\s*hostname:[^\S\x0A\x0D]*((?:[A-Za-z](?:[A-Za-z0-9\-]{0,61}[A-Za-z0-9])?\.)*[A-Za-z](?:[A-Za-z0-9\-]{0,61}[A-Za-z0-9])?)$

だけど
0403デフォルトの名無しさん
垢版 |
2018/01/16(火) 12:15:21.97ID:RA24ssqp
正規表現の書き方教えてください。

CentOS 7のサーバーにURLを要求した際、下記のような余計な文字が付きます。付くことがあります。
/ディレクトリ/ファイル名.拡張子%01
/ディレクトリ/desktop.inib%01
/ディレクトリ/desktop.inie%01

またファイル名の後に、
%EE%81%9F%E2%81%80%EE%81%97%C9%84とか
%E6%89%B8%E7%A8%B7%E4%99%BA%E5%A5%97%E3%8D%95%E4%BD%8C%E6%A1%B2%01とか
ファイル名の語尾に不特定の文字が勝手に付く場合もあります。
ディレクトリを要求したときも
ディレクトリの語尾に%E4%84%B7など(これも不特定)が付いてしまうことがあります。

これを除外するには、
正規表現でどのように書けば良いのでしょうか?

よろしくお願いします。
0406403
垢版 |
2018/01/16(火) 14:48:31.79ID:RA24ssqp
ありがとうございます。
自分の場合「空」にはなってませんが似てますね。
便利なクライアントアプリケーション探してみます。
0407デフォルトの名無しさん
垢版 |
2018/01/16(火) 17:00:43.44ID:1yOH1J8J
pattern = /^(.*)(?!%)/

p pattern.match('abc%123')

Ruby で否定先読みを使ったら、「abc」だけ取れない。
すべての文字列にマッチしてしまう

なんでやねんw
0408デフォルトの名無しさん
垢版 |
2018/01/16(火) 17:14:43.11ID:G8V+pnDB
なんでやもなにも、.* だから全体にマッチするよ。1文字ごとにチェックするか、文字クラスを使いなさい。
0409デフォルトの名無しさん
垢版 |
2018/01/16(火) 18:31:44.93ID:1yOH1J8J
Ruby では、先頭から、% を探して、それ以降を削除する

str = '/dir/desktop.inib%01%EE%81'
pos = str.index('%')

if pos
str = str.slice(0...pos)
end

puts str

結果
/dir/desktop.inib
0410409
垢版 |
2018/01/16(火) 19:25:09.57ID:1yOH1J8J
正規表現でも、できた。
Ruby では、先頭から、% 以外の文字を探す

pattern = /^[^%]+/
str = '/dir/desktop.inib%01%EE%81'

puts pattern.match str

結果
/dir/desktop.inib
0411デフォルトの名無しさん
垢版 |
2018/01/16(火) 20:18:43.79ID:y9BMfGeo
要件には書いてないけど, .iniまでが正しいファイル名だと思うよ
その後ろのbとかeもゴミ
0412デフォルトの名無しさん
垢版 |
2018/01/16(火) 22:39:12.31ID:9E60uHWe
どういう法則性でb,eが付いたのかがわからないと、
b,eの他にも付くのがあるのか、また付かないこともあるのかもわからん
例えば、hoge.exee%01とかになるのか?
0413403
垢版 |
2018/01/17(水) 15:18:31.78ID:BVJUZk9+
皆さんありがとうございます。

>>412
それ以外にも幾つか変な文字の時もあり、
問題なく何も付かない時もあります。
決まったパターンは無いと思った方が良いですね。

すべてが1byte文字の時は
0414413
垢版 |
2018/01/17(水) 17:17:53.77ID:BVJUZk9+
最後に変な文章を残してしまいました。
すべてが1byte文字を要求するときは、
そんな変なゴミは付きにくいと書こうと思ったのですが、
まだ確証が無いので無視して結構です。
0415デフォルトの名無しさん
垢版 |
2018/02/07(水) 23:42:01.50ID:3vNjEx0B
●Regular Expressionの使用環境
桜エディタ(テキストエディタ)

●検索か置換か?
置き換え

●説明
文字数、文字種はいろいろです。ただしすべて半角(1バイト文字)です。
結果として、<>内の文字だけにできればどんな方法でも構いません

必要な情報かわかりませんが、<>の外には、<>があることはありません。
asqa>w3e<a>s98<as897kja> ←こんな感じの行はありません。
行末は必ず、>で終わり、必要な文字は必ず<>でくくられたものの中にあります。
いらない文字<必要な文字>ここに改行が入る という書式は絶対です。

●対象データ
R&^&*(!TYUIKM<slihfd>
BA%(*&%ASAS<asdlikh>
TF^(VB(*&N<a09sfyighkljn>

●希望する結果
slihfd
asdlikh
a09sfyighkljn


よろしくお願いいたします。
0419デフォルトの名無しさん
垢版 |
2018/02/08(木) 23:37:41.58ID:kN+YdVUy
このぐらいの正規表現なら基本だし, 覚えると正規表現の載ってるエディタでの編集が楽になるよ
とりあえずPerl互換を勉強してみるといい
0420デフォルトの名無しさん
垢版 |
2018/02/14(水) 13:35:37.03ID:2LP2x+pK
C#なんですが

[ああ]おおおおお
[いいい]こここここ
[うう][ええ]そそそそそ
ととととと[たた]



おおおおお
こここここ
そそそそそ
ととととと[たた]

にしたいんですが、どうしたらいいでしょうか。
※先頭じゃない文中の[はは]は残したい
0423420
垢版 |
2018/02/16(金) 14:11:39.72ID:CWd36B/o
1行目でバッチリ
感動しました!!!
0425421
垢版 |
2018/02/16(金) 15:30:22.93ID:mPXTHkFg
>>424
文中は消えていいんじゃない?

>>420
> [うう][ええ]そそそそそ
> そそそそそ

ってあるし
あ、

> ※先頭じゃない文中の[はは]は残したい

この[はは]はマッチしたらダメなのか
これ例の中においてくんないかなー
というか定義がよくわからんちん

^\[.*\](?!$)
ところによっては(?<=(?:^|\n))\[.*\](?!(?:\n|$))

マッチ
[ああ]おおおおお
[いいい]こここここ
[うう][ええ]そそそそそ
[たた]ななはは[まま]やや
→[たた]ななはは[まま]
[たた]ななははまま[やや]
→[たた]

アンマッチ
ととととと[たた]
ちち[はは]ぱぱまま
0426421
垢版 |
2018/02/16(金) 15:30:54.45ID:mPXTHkFg
>>425
[たた]ななはは[まま]やや
の[まま]を含めずマッチしたい([たた])ならかなり複雑になりそうでちょっといますぐは思いつかないや

それってつまり
 行頭[
 行頭から括弧が繋がり、且つ、行末]を含めない範囲
なら
[たた][なな][はは][まま][やや]
のマッチが
→[たた][なな][はは][まま]
でいいのか、それとも行そのものがアンマッチなのかよーわからんし
0427デフォルトの名無しさん
垢版 |
2018/02/16(金) 15:55:42.80ID:CPKH/1dQ
>>425
カッコ内も同じ文字が重なるように読めるしなー
まぁこういう仕様をちゃんと書けるならそもそも正規表現で困らんのだろうけど
0429デフォルトの名無しさん
垢版 |
2018/02/16(金) 16:00:32.77ID:CWd36B/o
すみません

[ああ]おおおおお    → おおおおお
[あああ]おおおおお   → おおおおお
[ああ][いい]おおおおお → おおおおお
あああああ[いい]     → あああああ[いい]
あああ[いい]うう      → あああ[いい]うう

です。
先頭付近の [] は消したいけど、それ以外は残したい、って風です。
0430421
垢版 |
2018/02/16(金) 16:24:42.64ID:rLsYeXBU
>>429
[たた]ななはは[まま]やや
は?
[たた][なな][はは][まま][やや]
はどーなんの?

[あいう[かきく]たちつ]
[あいう[かきく]]たちつ
とか括弧内包の場合どーなんのとかも

あと行末も係わるんだから、例の同じ行に余計な文字列入れないで(たぶんこの件では大過ないと思うけど)
0431421
垢版 |
2018/02/16(金) 16:25:23.31ID:rLsYeXBU
>>430
内包無視するとしたら
(?<=^)(?:\[[^\[]*?\])+(?!$)
ところによって(?<=(?:^|\n))(?:\[[^\[]*?\])+(?!(?:\n|$))
かね

>>429を満たし、
[たた]ななはは[まま]やや
→[たた]
[たた][なな][はは][まま][やや]
→[たた][なな][はは][まま]
となるし

たぶん
 行頭[ および 行頭[に対応する]までマッチ
 行頭[ および 行頭[に対応する]から括弧が繋がり、且つ、行末] および 行末]に対応する[までを含めない範囲
あたりなんだろうなー
ぱっと思いつくのはちょめちょめしたダウンロードファイルのリネームをしたいようなかんじかね
0433デフォルトの名無しさん
垢版 |
2018/02/16(金) 17:00:58.65ID:Q4bZpk0j
正規表現の使いどころってどんなところですかね?
普通レベルのプログラマから見ると可読性低くて保守性も悪い気がする
タグの要素を最初にバッと配列に入れやすいとか?
0434デフォルトの名無しさん
垢版 |
2018/02/16(金) 17:11:19.84ID:GgVv8IsN
>>433
可読性低くて保守性も悪いっていうのは本当にその通り
プログラミングで使うならまずは(正規表現が非常に直感的でない限りは)正規表現以外の選択肢を考えるべきで, それが可読性や保守性を上げないとなった上で正規表現が選択されるのがよい
勿論保守性や可読性を気にしないワンライナーとかであれば気にする必要はないが

あとはエディタやgrepなんかだと他に有力な選択肢がないから正規表現になる
0436デフォルトの名無しさん
垢版 |
2018/02/16(金) 17:23:34.33ID:GgVv8IsN
>>435
全然ダメ
入力が

[abc]def[ghi]

なら全文がマッチする(量化指定子*はgreedyだから末尾手前まで全部食う)
0437デフォルトの名無しさん
垢版 |
2018/02/16(金) 17:34:31.04ID:dBpGhFbZ
>>433
実行環境によってだけどコンパイルされて速くなったりするので
さくっと一行で書けるならメリットはあるよ
プログラム書いた方が良い場合もある
ケースバイケース
0438デフォルトの名無しさん
垢版 |
2018/02/16(金) 18:30:54.06ID:Q4bZpk0j
>>434
>>437
レスサンクスコ
今Pythonで作られているパッケージを保守してるんだけど、お約束のように最初に正規表現で抜いて後で編集してる
最初のパフォーマンスを考慮してるのかもだけど、読みにくくて一般人にはいいことないよ
0439デフォルトの名無しさん
垢版 |
2018/02/16(金) 19:13:24.69ID:M8XJLm2H
>>433
ワンライナーで可読性保守性とか気にしない
ストリームエディタで検索、ログの抽出が最たる用途じゃないか
0440デフォルトの名無しさん
垢版 |
2018/02/16(金) 20:46:56.42ID:d9VDf+sb
>>420
$# 「行頭部分にある 1 個以上の \[[^\]*\] を削除」と初見で思ったのだが、違うのか?
$# それとも C# でどうやるかわからないという話? 申し訳ないが C# は知らない。
$
$cat a_in
[ああ]おおおおお
[いいい]こここここ
[うう][ええ]そそそそそ
ととととと[たた]
[ええ]あああ[いい]うう
$perl -pe 's/^(\[[^\]]*\])+//' < a_in
おおおおお
こここここ
そそそそそ
ととととと[たた]
あああ[いい]うう
$perl -0777 -pe 's/^(\[[^\]]*\])+//gm' < a_in
おおおおお
こここここ
そそそそそ
ととととと[たた]
あああ[いい]うう
$
0442デフォルトの名無しさん
垢版 |
2018/02/17(土) 05:30:35.08ID:xZfN9pA3
何を望んでいるのかを明確にする方が先かと……
0443デフォルトの名無しさん
垢版 |
2018/02/17(土) 11:13:15.50ID:sN1lrGX4
>>441
none-greedyじゃ先頭しかマッチしない

[abc][def]ghi

の[abc]しか除去出来ない
反復適用すればいいというならその通りではあるが
0444デフォルトの名無しさん
垢版 |
2018/02/17(土) 11:27:08.57ID:IU1gsQgu
[ab][cd][ef]ああ

これは、繰り返しが入っている。
N回削除する必要がある

[ab][cd][ef]ああ
[cd][ef]ああ
[ef]ああ
ああ

[〜] でグループ化すべき
0445デフォルトの名無しさん
垢版 |
2018/02/17(土) 12:22:01.47ID:IU1gsQgu
/^\[[^\]]*\]/ =~ "[ab][cd]ああ"
$& #=> [ab]

Ruby で書いた。
行頭が\[ で、\[ 以外の文字が、0以上続いて、\] がある
0446デフォルトの名無しさん
垢版 |
2018/02/17(土) 12:32:03.69ID:IU1gsQgu
/^\[[^\]]*\]/ =~ "[ab][cd]ああ"
$& #=> [ab]
$' #=> [cd]ああ

/^\[[^\]]*\]/ =~ $'
$& #=> [cd]
$' #=> ああ

/^\[[^\]]*\]/ =~ $'
#=> nil

Ruby で書いた。
行頭が\[ で、\[ 以外の文字が、0以上続いて、\] がある

$& はマッチした部分で、$' はマッチした部分の後ろを表すから、
マッチを繰り返していけば、出来るけど
0447デフォルトの名無しさん
垢版 |
2018/02/17(土) 12:42:57.33ID:IU1gsQgu
/^(\[[^\]]*\])+/ =~ "[ab][cd]ああ[ef]"
$& #=> [ab][cd]

やったー。Ruby で出来た

\[ があり、\[ 以外の文字が、0以上続いて、\] がある。
これをグループ化して、1回以上繰り返す

ただし、グループ外に、先頭からを指定する
0448デフォルトの名無しさん
垢版 |
2018/02/18(日) 07:04:41.40ID:4dAbe4pu
正規表現で使用される記号があるとワケわからなくなってくるから
適当な記号、例えばQなどに置き換えて試行錯誤して最後に元の記号に戻したりする
0449デフォルトの名無しさん
垢版 |
2018/02/18(日) 11:53:19.92ID:QWcmX5lk
余計なバックトラックを防ぐために
$s = qr/(?>\s*)/
ってやってパターンに埋め込むことならある。
0450デフォルトの名無しさん
垢版 |
2018/02/23(金) 22:29:48.73ID:vtIXFjR6
(?s:^(?=.*ス)(?=.*プ))
CHmateで使う正規表現らしいんだけど最初の

(?s:"

の意味が検索してもわからないのですが教えていただけないでしょうか
0452デフォルトの名無しさん
垢版 |
2018/02/24(土) 00:35:55.07ID:bvxyjlLF
>>451
ありがとございます
確認してなんとなく分かりました

ところでこの正規表現の場合(?s:)って名前には改行はないので不要じゃないかと思ってしまうのですがどういう目的で使われているのでしょうか
0453デフォルトの名無しさん
垢版 |
2018/02/24(土) 01:37:05.64ID:d6NztqhC
書いたヤツの趣味じゃ?
しかもかなりてきとう

ワッチョイ名前ならおそらくドコモ判別?でもプだけではないhttp://itest.5ch.net/test/read.cgi/mango/1467623805/312
先読みなんてコストかけなくてもKOROKORO AAはSd固定
改行を無理矢理入れ込んでというシチュエーションでスとプでねらい打ちも違和感

本文で^(?=.*A)の類を使うとレス数後半のコストはかなりのもの
これは名前だから大したことにはならないけど

深謀遠慮があるのかも知れんがそれこそ書いた本人へ
0454デフォルトの名無しさん
垢版 |
2018/02/27(火) 15:54:44.12ID:2v1tH105
C#で、
var rgx = new Regex("(.)+");
var str = "こんにちは。";
Console.WriteLine(rgx.Replace(str, "$1"));
とすると「。」が出力されるのですが、なぜですか?
$1は「。」になるのですか?「こ」だと思ったのですが、違いますか?
0456デフォルトの名無しさん
垢版 |
2018/02/27(火) 17:03:18.46ID:VEiALCIH
どれどれ…
javascript
'こんにちは。'.replace(/(.)+/, '$1');
=> "。"

ほんまや!知らんかった
0459デフォルトの名無しさん
垢版 |
2018/02/27(火) 22:02:02.32ID:u9k8VAiO
>>457
.NETはCaptureCollectionってのに入れてくれるみたいよ

ただフルマッチとキャプチャリンググループと両方1度に必要なければ
/(.){1}/みたいに正規表現変えれば配列に入れられるよね
0460デフォルトの名無しさん
垢版 |
2018/02/28(水) 21:03:30.09ID:V9ixSdqS
>>455
すみません。
教えて頂いたサイトを見ても分かりません。
簡単に解説をお願いしたいのですが。
0461デフォルトの名無しさん
垢版 |
2018/02/28(水) 22:05:09.20ID:pxJOkH76
単純に最後にマッチした部分ってことじゃないかな。赤ラクダにそう書いてある。
C# は知らない。誰か翻訳してあげて。
0462デフォルトの名無しさん
垢版 |
2018/03/01(木) 00:07:23.55ID:UkKloD3U
>>460
キャプチャグループに量指定子がついてるとそのキャプチャグループの箇所に複数回マッチする可能性があるよね。
んで複数回マッチした場合は最後にマッチしたやつがそのキャプチャグループに入ってるってこと

"こんにちは。”に対して、/(.)+/でマッチをかけると
最初にピリオドが“こ”にマッチしてそれをグループ1に入れて
次に+を見てまたマッチするか繰り返す
今度はピリオドに”ん”がマッチするからそれをグループ1に入れて、、、
あとは繰り返し
“こんにちは。”が/(.)+/にフルマッチした時点でグループ1に入ってるのは”。”
0463デフォルトの名無しさん
垢版 |
2018/03/01(木) 00:17:03.42ID:ikcjc59H
/(.+)/ =~ 'こんにちは。'
$1 は、'こんにちは。'

/(.)+/ =~ 'こんにちは。'
$1 は、'。'

上は、1回しかマッチしていない、最長マッチ。
下は、1文字のマッチで、6回マッチして、最後のマッチが、'。'
0464デフォルトの名無しさん
垢版 |
2018/03/01(木) 00:55:21.78ID:UkKloD3U
>>463
うーん、1文字マッチで6回マッチするのはどっちも同じじゃない?
キャプチャグループに入れる回数の違い
0465デフォルトの名無しさん
垢版 |
2018/03/01(木) 02:58:48.22ID:ksBcbegD
>>462
なるほど。
0466デフォルトの名無しさん
垢版 |
2018/03/01(木) 05:29:23.47ID:AobHbkwq
詳細 ○○表現
尼での評価がよかったので買ってみたが全然
リファレンスにもならない
やっぱり海外の訳本はだめだ、すくなくとも自分には良書でなかった
0467デフォルトの名無しさん
垢版 |
2018/03/01(木) 15:52:15.50ID:UkKloD3U
フクロウ本のことかな
中の仕組みを理解するための本であって
リファレンス本でも入門書でもないからね
0468デフォルトの名無しさん
垢版 |
2018/03/02(金) 09:24:29.36ID:O5NS5hyG
>>464
そういうマッチャー自分で作る時はスキップするよう作るけど
正規表現エンジンはしないのか
複雑だとやってられないとかか
0469デフォルトの名無しさん
垢版 |
2018/03/02(金) 13:01:46.53ID:btKfsNEv
試しに
for pat in '([cd])+' '(.)+' '.*(.)' ; do perl -Mre=debug -e '$pat = shift; print "abcd" =~ /$pat/ ,"\n" ;' "$pat" ; done
ってやってみた。最適化してそうだ。.*(.) は意味的には同じだと思うがバックトラックの分だけ不利。
Perl のソースコードを確認したわけではないので断定はしかねるが。
0470デフォルトの名無しさん
垢版 |
2018/03/03(土) 08:34:43.98ID:ooAwkD9v
今はサンプルだからいいけど
長大な文章じゃスキップで最適化しないとやってられないよな
0471469
垢版 |
2018/03/03(土) 13:47:58.16ID:GJwmn3yF
個人的には (.)+ と書くべき理由が思い当たらない。
0473デフォルトの名無しさん
垢版 |
2018/04/06(金) 19:38:34.22ID:U5C29TI1
複数のSQL文の書かれているSQLファイルから、DBの処理単位でSQL文を逐次取り出す正規表現が書きたいのですがどうしたら良いですか?
厳密なものでは無くても良くて英文字から始まってセミコロンで終わるというもので良いのです。
ただ、SQL分は行頭から始まるとは限らず、セミコロンの直後に次のSQL文が始まったり、空白文字などがあってからSQLの文が始まったりすることもあります。
また、文中に出てくるエスケープされたセミコロンや文字列中のセミコロンは文末の対象になって区切られては困るのでそれはスキップして評価がしたいです。
0475デフォルトの名無しさん
垢版 |
2018/04/07(土) 12:21:20.06ID:BRhgC8GS
multilineのオプション付けて
;でsplitしただけじゃだめなん
0476デフォルトの名無しさん
垢版 |
2018/04/07(土) 12:23:00.56ID:BRhgC8GS
>>474
それが含まれる時点で無理に正規表現一行で書くのはいつもあきらめる
0477デフォルトの名無しさん
垢版 |
2018/04/07(土) 12:30:00.76ID:LBmouzwW
ちゃんとやるなら文字列中のエスケープされたシングルクォートとかも処理しないとダメだし正規表現でやるのはすごく大変だと思う
0479デフォルトの名無しさん
垢版 |
2018/04/08(日) 06:27:09.85ID:1mmlbc0v
1. ; で分割して、配列に入れる
2. 配列の各要素から、余分なものを削除する

2 のルールを、厳格に決めればよい

Ruby で作る方が速い
0480デフォルトの名無しさん
垢版 |
2018/04/08(日) 11:04:16.11ID:YK+KPtHu
正規表現は置いといて
DB用意して""で囲まれた部分をテキストとしてDBに入れながらID取得
本文側はIDに置き換える
あとは正規表現を使っても使わなくてもいいが;で分割
最後にまたID部分に元のテキストを流し込む
0481デフォルトの名無しさん
垢版 |
2018/04/08(日) 13:00:20.92
そこであきらめんなよ!
正規表現だけで乗り切ろうという気概を見せろよ!
0482デフォルトの名無しさん
垢版 |
2018/04/08(日) 13:08:05.41ID:wO4VFvVz
(シングル|ダブル)クオート文字列って正規言語で表せる範囲にあるんかね?
文脈自由言語では表せるけど
0486473
垢版 |
2018/04/09(月) 10:33:55.69ID:Q+cYQrXX
沢山ご回答ありがとうございます。
皆さんのご意見を伺った限り、やはり正規表現一本では難しそうですよね…

はじめは前処理で既成のsqlパーサなどを通して、きれいに整形して別ファイルに保存してから処理する方法も検討していましたが、
できれば現物ファイルを生のまま読み込んで正規表現でなんとか行けないかなと思い試行錯誤していて、
うまい書き方が全然できなくてここに書き込みさせて頂いた次第です。

>>483
使用できる正規表現はPCREです。

具体的にはPHPで省メモリで巨大なSQLファイルを実行する仕組みが作りたくて
相談させてもらいました。自分の頭の中のアイデアでは
 1.fileをbufsize分readして
 2.正規表現でマッチするかチェック
 3.マッチしていたらそのSQLを実行。マッチした文より、先の部分は次の実行のためにバッファに積んで1へもどる
 4.マッチしていない場合は更にbufsize分read、2->4を繰り返す。
こんなイメージでした。

それを鑑みると、>>480さんのアイデアはちょっとありかなとも思います。
スレ違いなっちゃいますが、regexを使わずプログラム上でクオートの始まりと終わりを正しく
処理できれば随分楽できそうな気がします。一考の余地ありですかね?
0487デフォルトの名無しさん
垢版 |
2018/04/09(月) 12:10:15.13ID:M/BmQ9Z1
"'", "\""
'"', '\''

クォーテーション内にクォーテーションがある、入れ子状態が難しい。
クォーテーションを、\ でエスケープしたりもあるし

XML Parser とか、プログラム実行の命令木とか、解析ツールを使わないと無理。
プログラミングで何とかできる、範囲を超えている

そもそも、入れ子状態にどういうパターンがあるのか、
全列挙して考えるのが、非常に難しい

入れ子の入れ子とか、再帰的に入れ子するかも知れないし
0488デフォルトの名無しさん
垢版 |
2018/04/09(月) 17:17:14.98ID:4vJW9Ikj
>>486
こういう感じでどうだろう
[a-zA-Z](?:\\"|\\'|[^"';]|(["'])(?:\\\1|(?:(?!\1).))*(?<!\\)\1)*;
英数字で始まって、\"や\'は許す;で終わる文字列
頭に^\s*を付けたほうがいいかもしれないけど
文字列は、" ' "、' " '、" \" "、' \' 'は許す( ; もOK)

ところで、" ' " ' "とは書けるんだっけ?
こういう括弧のネストが可能なら、正規表現の方もネスト構文や条件構文を使わないといけないけど
(俺は使ったことはないけど)
0491デフォルトの名無しさん
垢版 |
2018/04/10(火) 00:21:39.82ID:oEQHPFsL
仕様を確定させるのが難しい。
単なるテキストには、ルールが無いだろ

XML とか、プログラム言語には、仕様があって、
ルール違反の書き方を許さないから、プログラムで判定できる

だから、まずこう書いたらエラーにする、という仕様を決めるべき
0493デフォルトの名無しさん
垢版 |
2018/04/11(水) 13:14:45.93ID:p/bo/Ju1
試しに Perl でやってみた。最も楽観的な想定ならこのくらいまでは手抜きできる。

use strict;
my $comment = qr/(?:--.*?\n)/ ;
my $literal_ch = qr/(?:\'\'|[^\'])/ ;
my $ch_str_literal = qr/(?:\'(?>$literal_ch*)\')/ ;
my $other_ch = qr/[^\';]/ ;
my $some_str = qr/(?:$comment|$ch_str_literal|$other_ch)/ ;
my $statement = qr/(?:$some_str*;)/ ;
my $text = '';
while (<>){ $text .= $_; while ( $text =~ s/^$statement// ){ print("Found:$&\n") }}

文字列リテラルの中の文字の記法に特に対処すべき拡張があるなら $literal_ch に加えれば良い。
" は識別子を書くためのものだが '、;、-- のどれかが入る可能性があるなら $other_ch と $some_str に加えればいいだろう。
多分、問題はそこではない。この例では行単位の入力だから面倒な問題を回避できているが、そうでない場合の問題だ。
たとえばコメントの始まりの - までしか読まれていないという場合。もっと読まなければコメントかどうか判断できない。
あるいは文字列リテラルの中で ' が現れた場合。それは文字列リテラルの終わりなのか、それともリテラルの ' を表す '' の 1 文字目なのか。
こういう処理を自分で書くのは難しくはなくても面倒だし、処理速度も遅い。だから結局 flex を使ったりする。
0494デフォルトの名無しさん
垢版 |
2018/04/11(水) 14:19:31.82ID:jfPKheqL
仕様通りのParser とか、構文解析ツールが必要

それらを使って出力された、抽象構文木を使うのがよい
0495デフォルトの名無しさん
垢版 |
2018/05/04(金) 19:16:13.25ID:kVAlpXQV
★タイトル
★★タイトル

上のものにマッチさせたいのですが、
^★.*$
としてしまうと、下まで含まれるのですが、どうしたらいいでしょうか
0497495
垢版 |
2018/05/04(金) 21:14:35.89ID:L0LZvRGB
半角SP紛れ込んだわ

^★(?!★).*$
0498デフォルトの名無しさん
垢版 |
2018/05/05(土) 05:47:27.14ID:iaqxNbgL
↑解答どうも
できなかったです
ちなみにmeryというテキストエディタの正規表現です
何の言語かはわかりませんが
0500デフォルトの名無しさん
垢版 |
2018/05/05(土) 19:07:12.77ID:iaqxNbgL
↑ありがとうございます。行けました。
.*の前に否定を入れればいいんですね
0501デフォルトの名無しさん
垢版 |
2018/05/05(土) 21:57:45.66ID:+tF+3NSL
鬼雲…だと…?!
0502デフォルトの名無しさん
垢版 |
2018/05/07(月) 13:28:13.91ID:XtvW294Z
正規表現をちゃんと論理的に導きたいと思って参考になる本を
買ったら必要な予備知識に群とか環が出てきて即諦めた
正規表現周りの開発をしてる人達はすごい人達なんだなぁ
すごさを直で実感出来た
0503デフォルトの名無しさん
垢版 |
2018/05/07(月) 14:59:22.19ID:QMgv+0U5
用語に慣れてないだけだろ
やってることは大したことじゃない
0504デフォルトの名無しさん
垢版 |
2018/05/07(月) 18:08:31.65ID:XtvW294Z
まぁ膨大な時間と労力をかければ自分にも分かるんだろうけど
現実的じゃないんだよなぁ(人の何倍も時間かかるだろうし)

これからは正規表現技術者の努力に感謝しながら正規表現を
使おうと思います(^^)>
0505デフォルトの名無しさん
垢版 |
2018/05/14(月) 07:31:45.21ID:0PI4I4+g
JavaScriptによる正規表現チェッカー

くっそ長いので短縮
https://goo. gl/CE3aZ8

https://fatiherikli.github.io/fil/#eyJwYXRoIjoiSmF2YVNjcmlwdFRlc3QxLmpzIiwic291cmNlIjoiLyog5q2j6KaP6KG
o54++44Oe44OD44OB44OG44K544OIICovXG5cbi8vIOato+imj+ihqOePvlxudmFyIHJlID0gbmV3IFJlZ0V4cCgv
XFxkKy9nKTtcblxuLy8g44OG44Kt44K544OIXG52YXIgdGV4dCA9IChmdW5jdGlvbiAoKSB7LypcbmFhYVxuYmIx
MmJcbmM1NjdjYzg5XG4qL30pLnRvU3RyaW5nKCkuc3BsaXQoL1xcbi8pLnNsaWNlKDEsLTEpO1xuXG5jb25zb2x
lLmxvZyhcIlJlZ0V4cDpcIiwgcmUudG9TdHJpbmcoKSlcbmNvbnNvbGUubG9nKFwiVGV4dDpcIiwgdGV4dCk7XG5c
bnRleHQuZm9yRWFjaChmdW5jdGlvbihsaW5lKSB7XG4gICAgY29uc29sZS5sb2coXCJsaW5lOlwiLCBsaW5lKTtcbiA
gICB2YXIgcmVzdWx0ID0gbGluZS5tYXRjaChyZSk7XG4gICAgaWYocmVzdWx0KVxuICAgICAgICBjb25zb2xlLmxv
ZyhcInJlc3VsdDpcIiwgcmVzdWx0KTtcbiAgICBlbHNlXG4gICAgICAgIGNvbnNvbGUubG9nKFwicmVzdWx0OlwiLCBcIm51bGxcIik7XG59KVxuIn0
0507デフォルトの名無しさん
垢版 |
2018/05/19(土) 02:57:37.83ID:F73VBvr9
Linuxに触れるまで正規表現に方言があるなんて知らなかった
基本正規表現だの拡張正規表現だの
vimの置換で悩んでたら原因がエスケープの有無が原因とかもうね
ある程度は使えるが先読みとか後読みとか僅かでも深入りすると余計に混乱する
0508デフォルトの名無しさん
垢版 |
2018/05/19(土) 11:08:45.44ID:rxs2hai/
小さい世界で囲い込まれてれば楽だよな
ただし何かの拍子ではみ出した時に世界の広さを知って己の無力さを痛感する
よくあるパターン
0509デフォルトの名無しさん
垢版 |
2018/05/23(水) 19:28:29.89ID:Au5e7VGg
僕の知り合いの知り合いができたパソコン一台でお金持ちになれるやり方
役に立つかもしれません
グーグルで検索するといいかも『ネットで稼ぐ方法 モニアレフヌノ』

QBPEH
0511デフォルトの名無しさん
垢版 |
2018/05/25(金) 13:52:01.06ID:X/Hngdv+
HTMLの解析を正規表現でやりたいのですが

<a href="xxxxx"><img src="yyyyy" /></a>

という風に、<a> で括られた img の src だけを抽出したいんですけど
どうしたらいいのでしょう。

<a> で括られてない

<img src="yyyyy" />

は除外したいのです。
0512デフォルトの名無しさん
垢版 |
2018/05/25(金) 13:53:08.12ID:X/Hngdv+
あ、すみません

<a href="xxxxx"><img src="yyyyy" /></a>
<a href="xxxxx">あああ<img src="yyyyy" /></a>
<a href="xxxxx"><img src="yyyyy" />いいい</a>
<a href="xxxxx">あああ<img src="yyyyy" />いいい</a>
<a href="xxxxx"><img src="yyyyy" /><div>あああ<div></a>

みたいに、<a> の中は <img> 以外のゴミも入ってきます。
※ゴミは無視したい
0515デフォルトの名無しさん
垢版 |
2018/05/25(金) 20:00:28.32ID:OUvr9ihJ
頑張ってみてもこの程度が限界
https://regex101.com/r/VYrYNO/1

で, >>511がHTMLの解析を正規表現だけでやる理由は何だ?
Pythonのhtml.parser, RubyのNokogiri, PHPならGoutter, それ以外の言語でも間違いなくHTMLパーサは誰かしら作ってる
そんな中で何故正規表現だけで?ぶっちゃけこういう用途には向いてない, というかHTMLの構文規則は正規言語を超えるんだけど, 分かってる?
0516デフォルトの名無しさん
垢版 |
2018/05/25(金) 20:29:09.95ID:rhJz1xPv
パーサかましてXPathで必要な情報だけ抜くのが基本だしな
どうしても使えないっていう理由があるなら仕方ないけど
0518デフォルトの名無しさん
垢版 |
2018/05/25(金) 22:28:52.14ID:Cqv+6nk2
■変更前
004a34
A521n2
785b66

■変更後
0049934
99521992
7859966
----------------------

数値以外を99に置換したいです
お願いします
0519デフォルトの名無しさん
垢版 |
2018/05/25(金) 23:31:17.71ID:gd/oxjVv
木構造のものは、正規表現じゃ無理

1< 2< abc 3> 4>

2<からの最短マッチで、対応する3>を取れるけど、
1<からの最短マッチで、対応する4>を取れない。
3>にマッチしてしまうから

1< 2< 3< abc 4> 5> 6>

これでも、2<と5>をマッチさせられない。
最長・最短マッチでも、マッチしない

CSS セレクターを使う、jQuery, RubyのNokogiri などを使え。
これらの使い方は、ほぼ同じ
0520デフォルトの名無しさん
垢版 |
2018/05/25(金) 23:43:29.83ID:OUvr9ihJ
>>518
数値以外と簡単に言うが改行文字や空白等の扱いはどうするんだ
変換対象文字をちゃんと明示しないと

/[^0-9]/99/g

こんなもんが欲しいわけではあるまい
とりあえずASCII印字可能文字に限るなら

/[\x21-\x2F\x40-\x7E]/99/g

だが当然マルチバイト文字は対象外
0523デフォルトの名無しさん
垢版 |
2018/05/26(土) 17:59:00.22ID:xbMfHZm2
>>519
再帰を使えば、対応する括弧のネスト対応ぐらいならできるらしいよ(鬼雲、PCRE)
<([^<>]++|(?R))*>
   # [^<>]++は(?>[^<>]+)としてもよい(どっちもバックトラックしないと思う)
   # (?R)は、(?0)とも書ける
   # (<([^<>]++|(?1))*>)

\g<-n>を使ってもできる(鬼雲だけ?)
(<(?:\g<-1>|[^<>])*>)
   # \g<-1>は(?-1)とも書ける
   # ここでは\g<-1>を先に書いたが上と同じく後ろに書いても同じ
0524デフォルトの名無しさん
垢版 |
2018/05/26(土) 19:07:35.21ID:vUfk79H6
https://regex101.com/r/VYrYNO/1

なぁこれメンテしたいか?というか出来るか?なぁ?

(?i:<a(?:\s+[a-z][a-z0-9]*(?:=(?:"[^"]*"|'[^']+'))?)*>)
((?:
(?i:<img(?:\s+(?:src="([^"]+)"|[a-z][a-z0-9]*(?:=(?:"[^"]*"|'[^']+'))?))*(?:\s*\/)?>)
|(?i:<([a-z][a-z0-9]*)(?:\s+[a-z][a-z0-9]*(?:=(?:"[^"]*"|'[^']+'))?)*>(?1)<\/\3>)
|(?i:<[a-z][a-z0-9]*(?:\s+[a-z][a-z0-9]*(?:=(?:"[^"]*"|'[^']+'))?)*\s*\/>|.*?))*)
(?i:<\/a>)
0527デフォルトの名無しさん
垢版 |
2018/06/24(日) 13:33:59.68ID:wSHpLaLO
文字列の中から数字13桁(それ未満でも超えてもNG)を抽出するにはどうしたらいいでしょう
JANコードらしきを抜き取りたいのです。

候補を抽出してから後でチェックデジット計算しますので
数字13桁のみで大丈夫です。
0528デフォルトの名無しさん
垢版 |
2018/06/24(日) 15:06:08.45ID:F1zD07yq
数字40桁くらい連続してたらどうする?
0531530
垢版 |
2018/06/24(日) 20:41:43.34ID:LPLL+qJx
先頭と末尾も考慮すると
https://regex101.com/r/xT760t/2
(?:(?<=[^0-9])|^)[0-9]{13}(?:(?=[^0-9])|$)

ただかなりバックトラックするから性能は悪い
どうせチェックディジット確認するなら13桁以上で全抽出して桁数チェック追加した方がマシに見える

https://regex101.com/r/xT760t/4
[0-9]{13,}
0532デフォルトの名無しさん
垢版 |
2018/06/24(日) 23:39:40.09ID:chBT6m1a
結構、難しい

A <13桁の数字> B

A の部分が、文字列の先頭か、数字以外で、
B の部分が、文字列の末尾か、数字以外
0534デフォルトの名無しさん
垢版 |
2018/06/25(月) 08:32:20.35ID:g3low2hV
>>531
先読み後読みは先頭や末尾にも一致するからそういうのは無駄
>>530の二つ目で完成している
0535デフォルトの名無しさん
垢版 |
2018/06/25(月) 09:21:19.58ID:9/L2g6Oc
>>534
せやな, 否定前後読みならそのままでよかったわ(肯定で試しちゃった)
ただどのみちバックトラック多くて無駄だから正規表現だけでやるのでなければ13桁以上でマッチングして桁数判定入れるべきだと思う
0536デフォルトの名無しさん
垢版 |
2018/06/25(月) 21:12:44.36ID:lRi8bnr9
13桁を超えていても候補として受け取っておいて
チェックデジットの計算の手前で落とします。

どうもありがとうございました。
0537デフォルトの名無しさん
垢版 |
2018/06/26(火) 18:51:05.99ID:PFtq6YS9
文字列の先頭の文字以外を*に変換する
というのはどう書けばいいでしょうか?
0538デフォルトの名無しさん
垢版 |
2018/06/26(火) 20:16:27.74ID:IMFKH44M
こういうこと?

$perl -pe 's/(?!^)./*/g'
alpha
a****
beta
b***
gamma
g****
$

良い方法かどうかはわからないが。
0539デフォルトの名無しさん
垢版 |
2018/06/26(火) 20:22:51.32ID:IMFKH44M
perl -pe 's/(?<!^)./*/g'
とすべきだったかな。
0540デフォルトの名無しさん
垢版 |
2018/07/04(水) 22:06:49.23ID:gFgZc5FG
J1Q
0542デフォルトの名無しさん
垢版 |
2018/07/16(月) 14:08:24.67ID:80hpbb9v
1 2 3 の3つの文字を、順番不同で、必ず各々、1つ以上含む

a23b1 → 真
1a2 → 偽

これは順番の組み合わせだから、正規表現で出来ますか?
0543デフォルトの名無しさん
垢版 |
2018/07/16(月) 14:41:45.67ID:/+vnEc6c
>>542
先読みが使えれば

^(?=.*1)(?=.*2)(?=.*3)
0544デフォルトの名無しさん
垢版 |
2018/07/25(水) 19:56:10.60ID:1XdhMp/e
サクラエディタで
<>で囲まれていないaaaをあああにしたいです

<aaab>aaa<caaadaaa>baaadeaaa<ccc>baaad<baaa>aaabaaadaaa<ee>

<aaab>あああ<caaadaaa>bあああdeあああ<ccc>bあああd<baaa>あああbあああdあああ<ee>

>([^<>a]*?)(aaa)([^<>a]*?)<
>$1あああ$2<
だと「>aaa<」や「>baaad<」は置換できるけど「>baaadeaaa<」や「>aaabaaadaaa<」が置換できずに残る

そこで
>([^<>a]*?)(aaa)([^<>a]*?)(aaa)([^<>a]*?)<
>$1あああ$2あああ$3<
と変換するわけですが当然「>aaabaaadaaa<」が残り…
<>に囲まれていないaaaが沢山あるので変換しきれません
何とかならないでしょうか
0547デフォルトの名無しさん
垢版 |
2018/07/26(木) 09:15:37.25ID:4NbdqkDU
>>545>>546
できた!できました!
ありがとうございます
0548デフォルトの名無しさん
垢版 |
2018/07/29(日) 09:53:04.64ID:JxpitKP8

パターン1, (\d+)月(\d+)日
パターン2, (\d+)月(\d+)数字以外(\d+)日
これを一回で取得したい

●対象データ
7月1日
7月2〜4日
7月6から10日
7月12・13日

●希望する結果
7,1
7,2,4
7,6,10
7,12,13

お願いします
0552デフォルトの名無しさん
垢版 |
2018/07/29(日) 11:42:16.30ID:kCYuy8BN
数字取り出して変数に入れるだけなら /(\d+)月(\d+)(?:\D+(\d+))?日/gu で仕舞いだが
0556デフォルトの名無しさん
垢版 |
2018/08/12(日) 20:55:52.79ID:MOc1ccj1
C#で正規表現を使ってHTML内から文字コードをとってきたいのですが
以下の場合だと"UTF"としか取得できません。
"UTF-8"と取得する場合どうすればいいでしょうか?

<[^>]*\bcharset\s*=\s*[""']?(?<charset>\w+)\b


<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
0557デフォルトの名無しさん
垢版 |
2018/08/12(日) 21:30:40.27ID:mMH07JtW
>>556
HTMLは扱いが難しいからパーサ使った方がいい
どうしても正規表現だというなら,

1. とりあえず的な修正
https://regex101.com/r/sIUmzD/2
/<[^>]*\bcharset\s*=\s*(?:([^\s"'=><`]+)|'([^']*)'|"([^"]*)")\b/$1$2$3/i

2. もう少し気合の入れた修正
https://regex101.com/r/sIUmzD/1
|<meta
(?:\s+[^\s"'>/=]+(?:\s*=\s*(?:[^\s"'=><`]+|'[^']*'|"[^"]*"))?)*
(?:\s+charset(?:\s*=\s*(?:([^\s"'=><`]+)|'([^']*)'|"([^"]*)"))?)
(?:\s+[^\s"'>/=]+(?:\s*=\s*(?:[^\s"'=><`]+|'[^']*'|"[^"]*"))?)*\s*/?>|$1$2$3|i

ぐらいか
でもこれ後で読むのしんどいでしょ
0559557
垢版 |
2018/08/12(日) 21:53:09.85ID:mMH07JtW
2.の方を若干修正, charsetには値が必要ですわ
https://regex101.com/r/sIUmzD/3
|<meta
(?:\s+[^\s"'>/=]+(?:\s*=\s*(?:[^\s"'=><`]+|'[^']*'|"[^"]*"))?)*
(?:\s+charset\s*=\s*(?:([^\s"'=><`]+)|'([^']*)'|"([^"]*)"))
(?:\s+[^\s"'>/=]+(?:\s*=\s*(?:[^\s"'=><`]+|'[^']*'|"[^"]*"))?)*\s*/?>|$1$2$3|i
0560デフォルトの名無しさん
垢版 |
2018/08/12(日) 22:00:37.17ID:MOc1ccj1
>>557
ありがとうございます!
当方がやりたかったことは、HTMLをテキストデータとして大量に取得して、その中から特定のワードでの絞り込みです。
正しい文字コードでHTMLを落としてからパースしようと思ったのですが、確かにパーサでやる手もありそうですね

正規表現は今まで避けてきたので、読むのがシンドイっていうかチンプンカンプンですが
求めていた動作です。とても助かりました。
使わせてももらいます。ありがとうございました。
0561デフォルトの名無しさん
垢版 |
2018/08/12(日) 23:56:24.69ID:2UQfVx23
HTML のように、要素に親子関係があるもの・構造化されたものは、正規表現じゃ無理

<1><x></x><y></y></1>

開き・閉じタグで、前から一致させると、
<1></x> が対応してしまう

ネストも無限にできるから、対応させるのは無理。
パーサを使うべき
0564デフォルトの名無しさん
垢版 |
2018/08/13(月) 03:34:58.19ID:EnLsbSTB
>>561
一部の環境では括弧等のネスト構造を取り扱いをサポートした正規表現があるよ
PCRE(Perl 5.10以降)やruby(鬼雲)、Python,PHPなどでも
C#の.NET Framework環境でもあったんじゃないかな
0567デフォルトの名無しさん
垢版 |
2018/08/24(金) 02:29:36.02ID:cgE41D9D
>>561
> HTML のように、要素に親子関係があるもの・構造化されたものは、正規表現じゃ無理

そういうこともできるように拡張した正規表現があればいいのに
さらに階層、treeも可
0570デフォルトの名無しさん
垢版 |
2018/08/24(金) 10:38:07.25ID:wb3Q/jKx
なんか知識が数年前で止まっちゃってる人がちらほらいるな
正規表現がネストに対応したのなんてもう一昔前ってイメージだけど
0572デフォルトの名無しさん
垢版 |
2018/08/24(金) 12:48:35.65ID:ZVlysGry
なんでも正規表現で済まそうとするひとって
意地でもVBA使い続けてるひとと大差ない
0575デフォルトの名無しさん
垢版 |
2018/08/24(金) 18:58:08.09ID:wb3Q/jKx
>>572
賢い人程手段をたくさん知り
その中から取捨選択するからな

>>571
さすがに勉強不足すぎだろw
何年前で知識止まってんだよ
0577デフォルトの名無しさん
垢版 |
2018/08/25(土) 00:35:41.84ID:I7tIpqHO
底辺に行くほど知識自慢はしかたがないだろ、正規表現に限らず

ただ掲示板的に質問したいのにバカがしゃしゃり出てきて迷惑だよな
0578デフォルトの名無しさん
垢版 |
2018/08/25(土) 10:52:22.58ID:J+b/MRtJ
的確な指示されても気に入らない回答だからと人の話を聴かない人は成長しないよ
自分の気に入る回答しかも自分と同じレベルの回答もらって喜んでればいい
0579デフォルトの名無しさん
垢版 |
2018/08/26(日) 15:08:37.66ID:sCPJIsfv
俺なんか中学の勉強もロクにしなかったのに正規表現を理解したいから
今、大学レベルの数学を勉強してる・・なかなか進まないけどね・・

>>556 の質問からパーサとか出てくるのはちょっと違うと思うよ
metaタグ拾えばいいだけだよね?難しく考えすぎだよ

あとHTMLソースのほうが糞で実際の文字コードとmetaタグで指定されてる
文字コードが違うなんてことや、文字コードの指定が複数個所あるなんていう
2ページ分のHTMLをそのままくっ付けましたなんていうのも稀にあるから
そういう糞なHTMLを相手にする場合は対応を考えないといけないね
0583デフォルトの名無しさん
垢版 |
2018/08/26(日) 18:08:41.45ID:sCPJIsfv
自分用に作るならこんな感じかなぁ、動作確認してないので使わないでね

|
<meta (?=\s) [^<>]* \s charset \s* = \s* (?:["']\s*)? ([^\s"'<>;]+)
|x;

こういうのは想定外  ※  " " の中に > がある

<meta comment="a>b" charset="UTF-8">
0585デフォルトの名無しさん
垢版 |
2018/08/26(日) 18:36:53.61ID:sCPJIsfv
>>583 のほうがスマートなのは一目瞭然でしょ
ただ >>583 は こんな感じ 程度のものなのでツッコミ所があっても知らないよ
0586デフォルトの名無しさん
垢版 |
2018/08/26(日) 18:37:23.43ID:5oVMxLBv
mataタグでのcharsetは定型的でしか使われないんで、仕様的に色々な場合に対応するのは無駄
俺が使うなら、こんなので十分
/<meta[^>]*\scharset=(["'])((?:(?!\1).)+)/i
0588デフォルトの名無しさん
垢版 |
2018/08/27(月) 04:46:33.83ID:2QlJLeh2
マッチングテスト

[1] <meta charset="UTF-8">
>>557 1. 失敗
>>559   マッチ
>>583   マッチ
>>586   マッチ

[2] このスレのHTML
557 1. マッチ
559   失敗
583   マッチ
586   失敗
0589デフォルトの名無しさん
垢版 |
2018/08/29(水) 16:43:59.44ID:4UnjToZE
こんなバカが回答者してたのか
過去レス見ると前から張り付いてるようだね
0591デフォルトの名無しさん
垢版 |
2018/08/31(金) 21:09:12.34ID:5NewXZva
bregonig.dll 2017/01/17 Ver.4.10 非包含オペレータに対応

うーん、非包含にマッチする正規表現はいつか自分で作れるように
なりたいと思ってたけど内部で勝手に作ってくれる時代になってしまったか〜

自分の知識は2013あたりで止まってるから浦島だ
0592デフォルトの名無しさん
垢版 |
2018/09/01(土) 01:28:06.31ID:0IlLcsWm
ab(?~ba)ba

これを

ab((?!ba).)*ba

この従来通りの方式をベースに記述して、かつ、前者とまったく同じ
動作に書き直すことは可能かな?

両者の違いについては>>590のリンク参照
0593デフォルトの名無しさん
垢版 |
2018/09/01(土) 22:17:13.09ID:0IlLcsWm
(?~abc)
これは↓とまったく同じ動作になると言って良さそう
(?:(?!abc).)*(?:(?=abc).{1,2})?

否定したい文字列が固定長なら先読みで書き換え可能らしい
0594デフォルトの名無しさん
垢版 |
2018/09/12(水) 19:47:12.85ID:j29ToL0A
正規表現を言語化できるようなとこ知りませんか?

/^ab/
これを入れると、

「abで始まる」
と変換されるようなサービスって無いでしょうか?
0595デフォルトの名無しさん
垢版 |
2018/09/13(木) 09:47:15.83ID:l9KSlvFS
せっかく正規表現にした意味が無い
0597デフォルトの名無しさん
垢版 |
2018/09/13(木) 13:28:20.78ID:a9m+mGXQ
視覚的に見れるサイトじゃなくて視覚的に作れるサイトがあったら便利かな
メタ文字を覚える必要が無くなるし動作を把握しながら作れる
そういうのが普及したらいいね
0598デフォルトの名無しさん
垢版 |
2018/09/14(金) 00:35:39.11ID:qC9qAPWt
そういうのとはちょっと違う&grepツールになっちゃうけど
TresGrepってのが入力欄でのマウス右クリックから正規表現を指定出来たり
正規表現1文字入力ごとにエラーチェック⇒NGならエラーメッセージを表示したりと
ちょっと便利
0600デフォルトの名無しさん
垢版 |
2018/09/14(金) 14:14:58.44ID:grBP2MzP
TresGrep使ってみたけど良くできてる
正規表現に何かしらの思い入れがあるのが分かる気がする

特に正規表現の複数行入力が出来るのはいい
自分は複数行入力が当たり前になるべきだと前から考えていて
それが実装されててちょっと感動してしまった
0601デフォルトの名無しさん
垢版 |
2018/09/17(月) 12:06:03.62ID:SR+usNFF
C#、System.Text.RegularExpressions.Regexの正規表現で

xxの中を取り出すにはどうしたらいいのでしょう?
ただし取り出したいのはトップのxxで、xxが閉じる前にyyがあるときはそのxxは無視という条件付きです

対象文字列 "<xx><xx><yy>111</yy></xx></xx><xx>222</xx><xx>333</xx>";
試した正規表現 @"<xx>.*?[^(</yy>)]</xx>"

結果
 <xx><xx><yy>111</yy></xx></xx><xx>222</xx>
 <xx>333</xx>

欲しい結果
 <xx><xx><yy>111</yy></xx></xx>
 <xx>222</xx>
 <xx>333</xx>
0602デフォルトの名無しさん
垢版 |
2018/09/17(月) 13:51:51.89ID:tNilsymD
プログラムとはちょっと違うのですが、2chMateで荒らしをNGする正規表現を作りたくて悩んでます

日本語で書くと、

"http://";又は"https://";が合わせてn回以上出てきた場合(対象は複数の改行を含む文字列)

にマッチするような正規表現って可能でしょうか?
0604602
垢版 |
2018/09/17(月) 15:04:16.06ID:tNilsymD
>>603
迅速なご回答ありがとうございます。
この方法でうまくいきました!
0605デフォルトの名無しさん
垢版 |
2018/09/18(火) 00:00:11.49ID:lHFpavF+
>>601
.NET Frameworkの正規表現は知らんけど、鬼雲でなら
(?=<xx>)(<(\w+)>([^<]*|\g<-3>)*</\k<-2-0>>)
これは最低限のものでイレギュラーなものには対応しない
  文字列でエスケープされてるとかコメントが入ってるとか
  タグにタグ名以外の余計なものが入ってるとか(</a href=...>とか<br />とか)
  ペアでないタグがあるとか(<br>のような単独タグ,<xx>と</xx>のどちらかしかないとか)
そういうのにも対応させるなら工夫して

一応、.NET Frameworkの正規表現の再帰については
https://qiita.com/HMMNRST/items/15800514bbe66f504789
0606デフォルトの名無しさん
垢版 |
2018/09/18(火) 00:12:00.46ID:oPOmCM6y
ありがと。もう少し単純にできるかと思っていたけどそんなに複雑になるのね
正規表現使わずにやる方向で考えてみます
0607583
垢版 |
2018/09/18(火) 00:55:53.38ID:t0fL3l18
>>605のリンク先見てやっつけで作ってみた

<xx>(?>(?:(?!</?xx>).)*)</xx>|<xx>((?'open'<xx>(?>(?:(?!</?xx>).)*))+(?'-open'</xx>(?>(?:(?!</?xx>).)*))+)*</xx>(?(open)(?!))
0609583
垢版 |
2018/09/18(火) 02:17:30.59ID:t0fL3l18
ミスってた、>>607はボツってことで・・
タグとタグの間の文字列の扱いが意外と難しい
0610デフォルトの名無しさん
垢版 |
2018/09/18(火) 06:08:34.66ID:oPOmCM6y
確かにダメ質問者w
「xxが閉じる前にyyがあるときはそのxxは無視」という一見簡単そうなルールが予想以上に難しいようで
楽したいから正規表現使いたいのだけどあまり複雑になると楽じゃないからほかに逃げたくなる
0611デフォルトの名無しさん
垢版 |
2018/09/18(火) 07:04:18.68ID:iA/s8q9i
ぶっちゃけ欲しい結果が何なのか結局よく分かってない

<xx>(?:(?<tag><(?!yy>)(?<tagname>[a-z]+)>)*\d+(?<-tag></\k<tagname>>)*(?(tag)(?!)))*</xx>
0612デフォルトの名無しさん
垢版 |
2018/09/18(火) 07:13:00.25ID:oqy73oSH
ID変わった
その表現だと <xx><xx><yy>111</yy></xx>
欲しい結果は<xx><xx><yy>111</yy></xx></xx>
こういう尻切れになることが多い
0613デフォルトの名無しさん
垢版 |
2018/09/18(火) 07:16:10.21ID:iA/s8q9i
どういうことよ
>>611の正規表現で <xx><xx><yy>111</yy></xx></xx><xx>222</xx><xx>333</xx> にマッチングすると

<xx>222</xx> と <xx>333</xx> にマッチするでしょ?
<xx><xx><yy>111</yy></xx> はどこから出てきたの?
0614デフォルトの名無しさん
垢版 |
2018/09/18(火) 07:42:45.15ID:oqy73oSH
申し訳ないミス。"<xx>.*?</xx>"の1件目の結果だったw
その正規表現だと2件マッチ
欲しい結果は>>601にある3件
0615デフォルトの名無しさん
垢版 |
2018/09/18(火) 07:46:54.65ID:iA/s8q9i
> xxが閉じる前にyyがあるときは
これは直前ってこと?
<xx><yy>111</yy></xx> にはマッチしないってことでいいの?
0616デフォルトの名無しさん
垢版 |
2018/09/18(火) 07:55:40.50ID:lHFpavF+
>ただし取り出したいのはトップのxxで
これだけで<yy></yy>があろうがなかろうが良いと俺は思ったんだけど
0617デフォルトの名無しさん
垢版 |
2018/09/18(火) 08:27:12.31ID:iA/s8q9i
yyがどうでもよければ
<xx>(?:(?:<(?<tag>[a-z]+)>)*\d+(?:</(?<-tag>\k<tag>)>)*(?(tag)(?!)))*</xx>
かなぁ
0618デフォルトの名無しさん
垢版 |
2018/09/18(火) 08:36:05.56ID:oqy73oSH
閉じる前というのは直前という意味で
対象が"<xx><xx><yy>111</yy></xx></xx><xx>222</xx><xx>333</xx><xx><yy>444</yy></xx>"
の場合は、<xx><yy>444</yy></xx>を無視したの3件マッチにしたい
>>611>>617ベースできそうだからがんばってみます。ありがとう
0620583
垢版 |
2018/09/18(火) 12:56:18.97ID:t0fL3l18
本来の数学的な正規表現という意味では向いてる質問なんだけどね
これぞ正規表現の仕事っていう質問

でもプログラムの検索で使う正規表現ではなかなか使われないね
0621583
垢版 |
2018/09/18(火) 13:25:09.30ID:t0fL3l18
>>607を修正

<xx>(?>(?:(?!</?xx>).)*)((?'open'<xx>(?>(?:(?!</?xx>).)*))+(?'-open'</xx>(?>(?:(?!</?xx>).)*))+)*</xx>(?(open)(?!))

これは>>605のリンク先の例を↓のように書き換えただけ

< を <xx>・・・
> を </xx>・・・
\A を <xx>
\z を </xx>

「・・・」 は<xx>または</xx>の間に挟まれている文字列

>スタック使う構文が必要な時点で
ああ、その通りだ、(r+s+)+ だけでは作れない
0622583
垢版 |
2018/09/18(火) 13:29:58.42ID:t0fL3l18
間違い
\A を <xx>

正しくは
\A を <xx> ・・・
0623583
垢版 |
2018/09/18(火) 18:51:49.51ID:t0fL3l18
>>611のはミスってるね
<xx><b><a>111</a></a></xx> にマッチする
<xx><b><a>111</a></b></xx> にマッチしない
この問題は>>617で修正されてる

()* \d+ ()* のところが0回以上のループで正しく動くのは面白いな
一番外側の (?: )* はいらないかも
0624583
垢版 |
2018/09/21(金) 05:18:40.73ID:LI7qokUP
(?# 主要部)
<xx(?&Attribute)>(?&innerText)(?&roop)?+</xx>

(?# 定義部)
(?:|(?!)
(?'Attribute'(?:\s[^>]*+)?+)
(?'singletag'br)
(?'tagname'[a-z][a-z\d]*+)

(?'innerText'
(?: [^<]*+
| <(?&singletag)(?&Attribute)>
)*+
)

(?'roop'
<(?'tag'(?&tagname))(?&Attribute)>
(?&innerText)(?&roop)?+
</\k'tag+0'>
(?&innerText)(?&roop)?+
)
)
0625デフォルトの名無しさん
垢版 |
2018/09/21(金) 05:54:00.34ID:LI7qokUP
こだわった点

・主要部と定義部に分けて全体の構造が分かりやすくした
・繰り返しは全て強欲。無駄なバックトラックをさせない
・再帰には * を使わず、部分呼び出し自身に繰り返しをさせている
・定義部は (?:|(?!) 〜 ) として定義部がサーチに使われるのを避けている

>>605には ([^<]*|\g<-3>)* という部分があって
([^<]*)* というバックトラック処理がえらいことになる部分があって気になった

あと再帰を使ってるのにループを * にさせているのを見て
* を使わずに書けるはずだと思って作ってみた
0626デフォルトの名無しさん
垢版 |
2018/09/21(金) 06:11:13.31ID:LI7qokUP
こういう書き方をした正規表現をサクラエディタで使おうとすると
1行に繋げなければならない、これでは不便すぎる
鬼雲の強力な正規表現を快適に使い倒せるようにするべき

出来れば複数行で書いた正規表現を1行に繋げる機能が欲しい
そうすればここのような掲示板に貼るときに便利
 逆に1行で書かれた正規表現を複数行に直す機能も欲しい
手動でいちいち改行を入れる手間が省けて快適になる

この2つの機能は正規表現ライブラリに実装されることが望ましい
そうすれば他のテキストエディタの作者も気軽に実装出来るようになる
正規表現に新しいメタ文字が作られたときの対応も容易になる
0627デフォルトの名無しさん
垢版 |
2018/09/21(金) 06:18:04.46ID:LI7qokUP
出来れば定義用の新しいコマンドが欲しい

定義のためのカッコなのにキャプチャが有効になってたり、
正規表現オブジェクトが無駄に肥大化してしまったりするから
0628デフォルトの名無しさん
垢版 |
2018/09/21(金) 07:17:48.30ID:fJq/snux
>>626
> 出来れば複数行で書いた正規表現を1行に繋げる機能が欲しい
ここはム板なので言い出しっぺの法則が適用されます
0629583
垢版 |
2018/09/21(金) 19:24:14.97ID:LI7qokUP
>>628
テキストエディタの正規表現の入力ウインドウに付けて欲しいんだ
次世代のテキストエディタは↓こうなって欲しい

1、画面をいっぱいに使って正規表現の複数行の記述が出来る
2、複数行で書かれた正規表現を一行に繋げるボタン
3、一行で書かれた正規表現を複数行に展開するボタン

これがスタンダードになるといいな
0632デフォルトの名無しさん
垢版 |
2018/09/21(金) 23:08:38.86ID:3+OghnRP
extendedフラグを付けて鬼雲に渡せば、複数行で処理してくれる。
エディタ側で1行にくっつけたりする必要はない。
0633583
垢版 |
2018/09/21(金) 23:41:08.24ID:LI7qokUP
>>632
そういうことじゃないんだな、>>626を読んでね

ちなみに複数行の正規表現を一行に繋げるのはかなり簡単なんだけど
一行で書かれた正規表現を複数行に展開するのはかなり難しい
正規表現のパーサを作るということになるから

だから正規表現ライブラリに実装されることが望ましい
ライブラリの作者なら細かい挙動まで把握しているから正確なパーサが作れる

逆にテキストエディタの作者がやろうとすると動作を把握しきれずに
不完全なものになったり、実装を諦めたりすることになりかねない
複数行をスタンダードにするためにはライブラリ側での実装が必須となる
0635583
垢版 |
2018/09/22(土) 21:31:53.89ID:SLHR4wJP
>>634
bregonig.dllはプログラミング用のライブラリをテキストエディタでも
使えるようにしたっていう感じなのでプログラミングに必要のない機能は
付けたくないと思う、管理が大変になるからね
だから次世代の正規表現ライブラリと次世代のテキストエディタに期待

ちなみにテキストエディタに重きを置いたライブラリならこんなのが可能になるはず

検索:( red(?'color='赤) | blue(?'color='青) | yellow(?'color='黄) )
置換:\k'color'

対象テキスト: blue
置換結果:青

現状の bregonig.dll でこれが出来ないということはプログラミングでなんとかなる
機能は付けないということ

テキストエディタのほうは改行をまたぐマッチの実現に苦戦してるようで
この問題が解決しないと高度な正規表現は宝の持ち腐れになるだけなので
次世代のテキストエディタに期待しましょう

>鬼車オリジナルの作者さん
別人だとは知りませんでした^^;
0636デフォルトの名無しさん
垢版 |
2018/09/26(水) 01:40:37.36ID:3FykrnoG
xyz? を含まないものにマッチする正規表現
http://www.din.or.jp/~ohzaki/regex.htm#WithoutXY
http://www.din.or.jp/~ohzaki/regex.htm#WithoutXYZ

> fmcat =(retofm

..のところで導かれている正規表現は明らかにxyやxyzを含む正規表現だけど
これは単なるミスなのかな?こんな難しいことをやってる人がこんなミスを
見逃すとはとても思えないから何か違うものなのかなぁ・・
0638デフォルトの名無しさん
垢版 |
2018/09/26(水) 10:58:06.87ID:3FykrnoG
>>637
> fmcat =(retofm
で始まる3行のところの正規表現についてですよ?
(〜)* x (〜)* yz の形なので明らかにxyzにマッチします

*y(x*[^xy]y*)*x* は誤植でしょうけど・・
0640デフォルトの名無しさん
垢版 |
2018/09/26(水) 23:39:54.65ID:3FykrnoG
やっぱり間違いなんですかね?
プログラムを使って自動的に算出してるようなのに・・
0641デフォルトの名無しさん
垢版 |
2018/09/27(木) 00:18:43.29ID:0xNuoCxe
俺もわからんけど、prologらしいから、括弧や表記はスタック順になってるとかでは?
0642デフォルトの名無しさん
垢版 |
2018/09/27(木) 02:58:15.53ID:TOnM2DUW
>prolog
なるほど、"xyを含まない正規表現" のところに grail って書いてあったのは
prologとやらの実行ソフト名だったのか
https://github.com/RichardMoot/Grail

これの使い方を調べれば謎が解けそうですね
暇なときに試してみます、ありがとう
0643デフォルトの名無しさん
垢版 |
2018/10/06(土) 17:50:41.16ID:0JYIRqz1
検索対象文字 <test>a="akari"desu</test>

正規表現 a="*"

で、検索結果が「a="akari"」でなく、「a="」しか取得できないのはなぜでしょうか?
0644デフォルトの名無しさん
垢版 |
2018/10/06(土) 17:56:12.23ID:e52HQVrn
馬鹿には無理
0645デフォルトの名無しさん
垢版 |
2018/10/06(土) 18:01:22.57ID:FAIH8E2E
a=\".*\"

メタ文字(ダブルクォート)をバックスラシュでエスケープ
.(ピリオド)で任意文字で0文字以上(アスタリスク)をつければ
とりあえずイケル

それでも意図どおりにマッチングしないことは予見できる
0646デフォルトの名無しさん
垢版 |
2018/10/06(土) 18:14:31.01ID:OZkGL/sg
ワイルドカードと混同しちゃってるのか
ワイルドカードと正規表現を同時に使えるTresGrepなら動くかも
0649デフォルトの名無しさん
垢版 |
2018/10/14(日) 12:53:05.30ID:zaukh1NH
>>643
ワロタw
正規表現の*とワイルドカードは違うぞ。詳しくはググれ。

多分a="[^"]*"でいけると思うけど詳しくはググれ。
0650デフォルトの名無しさん
垢版 |
2018/10/14(日) 14:33:15.06ID:eP/1gSav
ちょいと質問させて
a="[^"]*"
と書くことが多いんだけど
a=".*?"
と書くのとで結果に違いでるのかな?
0652デフォルトの名無しさん
垢版 |
2018/10/14(日) 15:11:22.83ID:zaukh1NH
あと、.*?は使えない正規表現の処理系があるんじゃなかったっけか。詳しくは(ry
0654デフォルトの名無しさん
垢版 |
2018/10/14(日) 22:51:29.78ID:yTLvFK6H
1、<test>a="[^\"]*"</test>
2、<test>a=".*?"</test>

この2つが↓これにどうマッチするか試してごらん
---------------------------------------------------------------------------
<test>a="pokemon"(^-^)</test> <test>a="doramon"</test>
----------------------------------------------------------------------------
0655650
垢版 |
2018/10/14(日) 23:38:50.12ID:wMwKNjnw
>>654
サンプルありがとう
でも、そういった検索/置換対象の場合だったら .*? は最初から考えないとは思う
0656デフォルトの名無しさん
垢版 |
2018/10/15(月) 00:13:04.80ID:fKW/Yset
この誤爆のことに注意を払えているなら .*? で問題ないよ
[^"] はそういう心配をしなくて良くなるからこっちを予防的に使うのもあり
0657デフォルトの名無しさん
垢版 |
2018/10/15(月) 22:36:58.63ID:fKW/Yset
# 文字列 xy を含まない正規表現
$states = 3;
@matrix = ( # E A p q ※ A は求める答え
[qw(X X E E)], # A = p + q = pε + qε
[qw(E X [^x] [^xy])], # p = p[^x] + q[^xy] + ε
[qw(X X x x)], # q = px + qx
);
0658デフォルトの名無しさん
垢版 |
2018/10/15(月) 22:37:39.83ID:fKW/Yset
# 文字列 xyz を含まない正規表現
$states = 4;
@matrix = ( # E A p q r ※ A は求める答え
[qw(X X E E E)], # A = p + q + r = pε + qε + rε
[qw(E X [^x] [^xy] [^xz])], # p = p[^x] + q[^xy] + r[^xz] + ε
[qw(X X x x x)], # q = px + qx + rx
[qw(X X X y X)], # r = qy
);
0659デフォルトの名無しさん
垢版 |
2018/10/18(木) 14:54:58.45ID:s3Db0e4D
y*(x*[^xy]y*)*x* について考察

左右対称形、後ろから読めば yx を含まない正規表現になる
x の後ろでは [^xy] しかマッチ出来ないようになっている

{[^x]|x+[^xy]}*x* # 状態遷移図から導かれる正規表現
# ※ ここでは見やすいように ( ) を { } としている
# 最後の x* は状態 0 から状態 1 への遷移を表している
[^x]*{x+[^xy][^x]*}*x* # 分岐の繰り返し ( | )* の展開
([^xy]|y)*{x+[^xy]([^xy]|y)*}*x* # [^x] を ([^xy]|y) に分解
y*{x*[^xy]y*}*x* # x+ を x* にすると中央の [^xy] が分解した [^xy] と
# 同じを動作するので分解した [^xy] を消せる、完成
0660デフォルトの名無しさん
垢版 |
2018/10/18(木) 23:54:36.85ID:s3Db0e4D
こっちのほうがスマートだ..

# 状態遷移図から導かれる正規表現
([^x]|x+[^xy])*x*

# [^x] を分解し、[^xy] と y にする
([^xy]|y|x+[^xy])*x*

# [^xy] と x+[^xy] を1つにまとめる
(y|(x+)?[^xy])*x*

# (x+)? は x* に書き換えられる
(y|x*[^xy])*x*

# 分岐ループを展開して完成
y*(x*[^xy]y*)x*
0661デフォルトの名無しさん
垢版 |
2018/10/20(土) 20:45:04.19ID:WB0b2hD6
(a|b|c)* の展開についての考察

# (b|c) を1つのパーツと考えて {a|(b|c)}* を展開する
a*{(b|c)a*}*

# 分配の法則
a*{ba*|ca*}*

# 再び (x|y)* の形が現れたのでここを展開する
a*(ba*)*{ca*(ba*)*}*

a=123、b=456、c=789 とすると
^(123)*(456(123)*)*(789(123)*(456(123)*)*)*$
0662デフォルトの名無しさん
垢版 |
2018/10/21(日) 19:43:06.22ID:7AODCPK7
(a|b|c|d)* の展開についての考察

a*(ba*)*{ca*(ba*)*}* の a は全て a* の形になっているのでこれを利用する
a を (a|d) に置き換えることで分岐を1つ増やす

(a|d)* = a*(da*)* なので a* を a*(da*)* に置き換えるだけで答えが求まる
a*(da*)*(ba*(da*)*)*(ca*(da*)*(ba*(da*)*)*)*

(a|b|c|d|f)* を求めたいときは同じように a* を置き換えるだけで求まる
このように a* は分岐を無限に増やす入り口のような役割をする
0663デフォルトの名無しさん
垢版 |
2018/10/21(日) 23:04:31.26ID:mkrTRrBN
このスレで名前が挙がってたTresGrep、気が付いたらbregonig.dllにも対応してるじゃん
プルダウンのモード切替で.NETの正規表現と切り替えられるのもいい感じ
もうこれでサクラエディタのGrepはお役御免にできるかもしれない

なんだけど・・・rubyの正規表現が全部使えるわけじゃないのに
「鬼雲検索」
を名乗るのはどうなんだろう
0664662
垢版 |
2018/10/22(月) 01:40:50.08ID:oA8lJo/T
>>663
ちょろっと試してみたけど戻り読みも後方参照も再帰もちゃんと動いたよ?
動かないのがあるならこちらで検証するよ〜
0666662
垢版 |
2018/10/22(月) 14:03:03.71ID:oA8lJo/T
自分は文字コードの知識が無いので迂闊なことは言えないから
ちょっと調べたことだけ書いておくね

ここで
http://k-takata.o.oo7.jp/mysoft/bregonig.html
\u0149 を検索してみるとbregonigでも使えてそうなことが書かれてたよ
0667662
垢版 |
2018/10/22(月) 21:23:16.87ID:oA8lJo/T
サクラエディタでいろいろ実験してたら \s が全角スペースにマッチした
サクラエディタ向けの正規表現を作るときには気を付けないといけないな
0668デフォルトの名無しさん
垢版 |
2018/10/22(月) 23:33:25.25ID:aIOUU5bU
bregonigは鬼雲の機能限定版(perl互換の正規表現だけが動く)って話をどこかで読んだ記憶があったんだよね
どうせやるなら本家onigmoのRuby版正規表現も全部動くようにすればいいのに、って思っただけなんだ
ちょっと難癖に近いなとは自分でも思ってる

\sもそうだけど\dに全角数字がマッチしちゃって痛い目に合うのもまれによくあること
サクラに限らないんじゃないかね
0669デフォルトの名無しさん
垢版 |
2018/10/23(火) 00:10:38.63ID:W9szHIq5
I/Fの問題だろう
Onigmoの仕様では、\sは
 Unicode以外の場合:
  \t, \n, \v, \f, \r, \x20
 Unicodeの場合:
  0009, 000A, 000B, 000C, 000D, 0085(NEL),
  General_Category -- Line_Separator
             -- Paragraph_Separator
             -- Space_Separator
 ASCII外の文字を含むかどうかは ONIG_OPTION_ASCII_RANGE オプションに依存する。
とある
実際、サクラエディタで試すと、
 2028(LS),2029(PS),
 0009,000a,000b,000c,000d,0085,
 0020,00a0,1680,2000,2001,2002,2003,2004,2005,2006,2007,2008,2009,200a,202f,205f,3000(SS)
がマッチする
なので、サクラエディタはUnicodeで鬼雲を使ってると思われる

Janeの場合でも、StyleはSJISであり、XenoはUnicodeなので
https://egg.5ch.net/test/read.cgi/software/1536058236/515
に対して、\d{6}がマッチするのはXenoのみである
0670662
垢版 |
2018/10/23(火) 00:11:35.27ID:FESm7ID8
なるほど、dll からは ONIG_SYNTAX_PERL しか使えないから
ruby を使い慣れてる人にとっては歯がゆいと..

> \dに全角数字がマッチしちゃって
ですね〜、(?a) で防げるようなので覚えておきます
0671デフォルトの名無しさん
垢版 |
2018/10/23(火) 00:18:39.55ID:FESm7ID8
レスが被ってしまった..

>>669
ありがとうございます
サクラエディタはUnicode仕様で動いているんですね
う〜ん、文字コードの話は難しいなぁ
0672デフォルトの名無しさん
垢版 |
2018/10/23(火) 00:24:56.92ID:W9szHIq5
なおUnicodeの空白でも、上記のCc(0009〜0085)、LS,PS,Zs(Space Separator)
以外のCf(200b,200c,200d,FEFF)だとどうかなと試したが案の定マッチしなかった
さすがは仕様どおりだ
0673デフォルトの名無しさん
垢版 |
2018/10/23(火) 01:02:05.21ID:FESm7ID8
> 200b,200c,200d,FEFF

サクラエディタにIMEパッドから打ち込んで試してみたら同じくマッチせず

# 主要部
(?&sp)
# 定義部
(|(?!)
(?<sp>
(?u)
[\x{200b}\x{200c}\x{200d}\x{FEFF}\s]
)
)

自分がこれ使うことは永遠になさそうだけどとりあえず..
0675デフォルトの名無しさん
垢版 |
2018/10/25(木) 14:38:08.86ID:4OmhnPU0
あるファイルパスがありディレクトリのN階層目までのみを抽出したいのですが、正規表現について教えてください

例えばこんな入力のリストがある場合
aaa
aaa/bbb/ccc
aaa/bbb/ccc/ddd/eee/fff
で各リストに対して2階層目までを取得したい場合
aaa
aaa/bbb
aaa/bbb
となるのが期待値です。

((?:¥w+¥/?){1,2})とかしてみたんですが上手くいきませんでした、お手数ですがよろしくお願いします
0676デフォルトの名無しさん
垢版 |
2018/10/25(木) 15:23:45.93ID:RdSksp9Y
>>675
正規表現はプログラム言語や正規表現オブジェクトのオプションによって
動作がけっこう変化するので質問するときはそういうの書いてね

[^/]+(?:/[^/]+)?

ただしこれは正しいパスが与えられることを前提としているので注意
0678デフォルトの名無しさん
垢版 |
2018/10/25(木) 15:39:26.06ID:5Cy/pQlU
./ で始まってたらどう数えるん
/ で始まってたら?
0679デフォルトの名無しさん
垢版 |
2018/10/25(木) 17:47:09.80ID:4OmhnPU0
>>676
ありがとうございます、perlが希望でしたので次回から書くようにします
例は2階層で固定のようですが、ちなみにn階層目とか可変で書くような場合は下記のような感じで良いでしょうか?
[^/]+(?:/[^/]+){0,n-1}
0680デフォルトの名無しさん
垢版 |
2018/10/25(木) 18:40:41.61ID:RdSksp9Y
ああ、N階層までのマッチという質問だったのか、ごめんね
それで合ってるよb
0681デフォルトの名無しさん
垢版 |
2018/10/26(金) 10:18:13.83ID:MwloQati
暇つぶしに鬼雲の再帰処理に欠陥がないか探してみたけど見つからなかった

例、\1 を空文字にマッチさせて再帰の無限ループを狙う
()(?<name>a|\1\g<name>c)

例2、<x> を複数使ってマッチするのが空文字ではないように見せかける
(?<x>)(?<x>text)(?<name>a|\g<x>\g<name>c)
0682デフォルトの名無しさん
垢版 |
2018/10/26(金) 23:39:01.03ID:MwloQati
・perl 5.22

if ( "a" =~ /^\Fa\E$/ )
{ print "match.\n"; }
else
{ print "no.\n"; }
# 結果: match.

・ サクラエディタ + bregonig.dll (ONIG_SYNTAX_PERL)

検索欄: ^\Fa\E$
テキスト: a
結果: 見つかりませんでした

\F の意味が知りたい..
0684デフォルトの名無しさん
垢版 |
2018/10/28(日) 00:53:19.71ID:ZnGbnC1U
http://jane2ch.net/community/kako/1299/12999/1299979723.html
レス241からの高速化の話題を検証してみた

レス243
>1は例えば (?:http://)〜 と、始めの数バイトをグループ化してやると速くなる

検証結果: 速度変わらず

レス245
> : の部分で一旦切れるようにすれば条件は平等になると思う
> (?:http:|ttp:|tp:) が速いわけではないと分かる

検証結果:
1. 10.345 ms
2. 10.560 ms
3. 05.130 ms

結論: (?:http:|ttp:|tp:) は速かった
0685デフォルトの名無しさん
垢版 |
2018/10/28(日) 01:36:44.44ID:ZnGbnC1U
<鬼雲のリファレンス>

(?<element> \g<stag> \g<content>* \g<etag> ){0}
(?<stag> < \g<name> \s* > ){0}
(?<name> [a-zA-Z_:]+ ){0}
(?<content> [^<&]+ (\g<element> | [^<&]+)* ){0}
(?<etag> </ \k<name+1> >){0}
\g<element>

<とんこ式記述法>

\g<element>
(?!(?!)tonco
(?<element> \g<stag> \g<content>* \g<etag> )
(?<stag> < \g<name> \s* > )
(?<name> [a-zA-Z_:]+ )
(?<content> [^<&]+ (\g<element> | [^<&]+)* )
(?<etag> </ \k<name+1> >)
)

リファレンス方式は後ろの {0} を読むまでそこが定義だと分からない
main部と定義部の境がはっきりせず読みにくい
対してとんこ式は (?!(?!)tonco 以降が定義部だと分かるので読みやすい
(?!(?!)tonco を とんこ で辞書登録しておけば {0} をコピペしなくて済む
とんこ式の とんこ とは発案者の名前とのこと
0686デフォルトの名無しさん
垢版 |
2018/10/28(日) 14:53:16.06ID:ZnGbnC1U
これらの記述法には1つ弱点があり

(?<name>ほにゃらら){0}

より前に

\k<name>

が出現すると文法エラーになる

例、
(?<tag>foo \k<name> bar){0}
(?<name>ほにゃらら){0}
\g<tag>

このため定義する順序が限定されてしまう、これは解消されるべき問題である
0688デフォルトの名無しさん
垢版 |
2018/10/28(日) 15:36:10.31ID:ZnGbnC1U
昨日、詳説 正規表現の本を枕の下に置いて寝た
寝ている間に正規表現のパワーがもらえると思ったからだ

すると.. 夢に正規表現の神様が現れた

神様 「 \1 はな、 ${1} と書いてもマッチするんじゃよ」

朝、目覚めると飛び起きてperlを動かしてみた

if ( "aa" =~ /(a)${1}/ )
{ print "match!!\n"; }
else
{ print "no match..\n"; }

実行結果を見た私は奇跡を見ていた
0689デフォルトの名無しさん
垢版 |
2018/10/28(日) 20:54:51.63ID:ZnGbnC1U
revilog.com/2012/08/7939.html
> a?[a-z] という正規表現は [b-z]|aa? という正規表現と
> 等価であり置換可能

前者は ab にマッチするが後者は...

> 同様に[a-z]?[A-z]という正規表現は [A-Z]|([a-z][a-z]?)
> という正規表現と 等価であり置換可能

前者は aA にマッチするが後者は...
0690デフォルトの名無しさん
垢版 |
2018/10/29(月) 00:52:40.24ID:BYis7ms7
・ perl 5.22

use strict;
use warnings;
use encoding "cp932";
binmode STDERR, ':encoding(cp932)';

if ( "アイウエオ" =~ /\p{Katakana}/ ){ print "match!! <$&>\n"; }
else { print "no match..\n"; }
# 結果: match!! <ア>

・ bregonig.dll (shift_jis)

検索:\p{Katakana}
対象:アイウエオ
結果:見つかりません

サクラエディタ (unicode) ではマッチした
(?a)\p{Katakana} でもマッチ
0691デフォルトの名無しさん
垢版 |
2018/10/29(月) 01:00:01.03ID:BYis7ms7
perl がマッチするのはもしかしたら内部的にunicodeになってるとかかな
自分はプログラマじゃないんでさっぱり
0692デフォルトの名無しさん
垢版 |
2018/10/29(月) 01:09:53.75ID:BYis7ms7
どうやら当たりらしい、unicodeに変換してからマッチしてた

if ( "あ" =~ /\x{3042}/ ) # true

if ( "あ" =~ /\x{82A0}/ ) # false
0693デフォルトの名無しさん
垢版 |
2018/10/29(月) 19:52:31.20ID:BYis7ms7
・再帰の穴を狙う2

(str)
(?<name>
(?(1)yes|no)
\g<name>
|inner)

↓これに書き換えると
(?(1)yes) → 文法エラー
(?(1)|no) → 文法エラー

ガードが鉄壁ですごい、ほんと良く出来てるな〜
0694デフォルトの名無しさん
垢版 |
2018/10/31(水) 16:56:37.48ID:ZWlmxwfj
(?(条件)真の式|偽の式) の不具合を発見

() に "?:" を付けるかどうかで結果が変わってしまう

対象テキスト: 13 に対し、

1、
\A(?<name>1)(?(<name>)(2|3))\z
結果:マッチ

2、
\A(?<name>1)(?(<name>)(?:2|3))\z
結果:みつかりません

bregonig.dll (shift_jis, unicode 両方で確認)

ちなみに対象テキストを 12 にするとどちらもマッチする
0695デフォルトの名無しさん
垢版 |
2018/10/31(水) 17:14:05.35ID:ZWlmxwfj
やっぱりこれ欲しいなぁ

検索:( red(?'color='赤) | blue(?'color='青) | yellow(?'color='黄) )
置換:\k'color'

対象テキスト: blue
置換結果:青

これの有無で便利度が数段変わるんだよね

これの代わりに複数回の置換を行うと \G を使うときに困る
同じものを複数回検索するので速度低下に繋がる
0696デフォルトの名無しさん
垢版 |
2018/10/31(水) 19:55:08.08ID:ZWlmxwfj
・ (?'name=~' )

変数name の中身をマッチテストする先読みの親戚のようなもの

(?'name' <div> .*? </div> )
(?:
 (?'name=~' \A .* abc .* \z)
 pattern1              # タグの間に abc があるとき
|
 (?'name=~' \A .* def .* \z)
 pattern2              # タグの間に def があるとき
|
 pattern3              # それ以外のとき
)

これもあると便利だけど (?(name) | ) で代用出来るから必要度は低い
0700デフォルトの名無しさん
垢版 |
2018/11/01(木) 17:34:43.67ID:+M+OiFJp
>>694 のバグがrubyでも起こることを確認
ruby 2.5.3p105 (2018-10-18 revision 65156) [x64-mingw32]

原因は bregonig.dll でなく Onigumo にあるようだ

これは気付きやすい部類のバグだと思うんだけど
今までバグ報告が無かったようなのが不思議
takata神はここ見てるのかな
0701デフォルトの名無しさん
垢版 |
2018/11/01(木) 17:41:25.59ID:+M+OiFJp
# ruby動作確認用コード

if '13' =~ /\A(?<name>1)(?(<name>)(?:2|3))\z/
# if '13' =~ /\A(?<name>1)(?(<name>)(2|3))\z/
p 'yes'
else
p 'no'
end
0702デフォルトの名無しさん
垢版 |
2018/11/01(木) 23:04:15.23ID:dBKH7CcG
>>691
perlの場合、Encode::decode()でperl内部処理用文字コード(utf8の亜種っぽい何か)に
正しく復号しないと正規表現クラスを正しく使えない。
0703デフォルトの名無しさん
垢版 |
2018/11/02(金) 01:26:49.16ID:XP4jtOby
>>702
解説ありがとうございます
ということは今まで自分はperl内部の独自の文字コードにエンコードされた文字列に
対して正規表現を使っていたわけですね、恥ずかしながら初めて知りました
0704デフォルトの名無しさん
垢版 |
2018/11/05(月) 20:41:07.84ID:SJelCvn/
>>683
畳み込み文字ってなんですか?
0706デフォルトの名無しさん
垢版 |
2018/11/06(火) 18:39:37.29ID:4TN3vyid
<正常>

(1)?
(?(1)(?:2|3)|4)

(1)?
(?(1)(?:2|3)|(?:4|5))

(1)?
(?(1)2|(?:3|4))

(1)?
(?(1)(2|3))

(1)?
(?(1)(?>2|3))

----------------------------
<異常>

(1)?
(?(1)(?:2|3))
0707デフォルトの名無しさん
垢版 |
2018/11/06(火) 19:30:27.97ID:4TN3vyid
<異常>

(1)?
(?(1)(?:2|(3)))

置換: [$2]
対象テキスト: 3
結果: [3]

-----------
<正常>

(1)?
(?(1)(?>2|3)|4)

(1)?
(?(1)(?>2|3)|(?>4|5))
0708デフォルトの名無しさん
垢版 |
2018/11/06(火) 19:36:59.61ID:4TN3vyid
>>707 の実験でバグの原因が分かった

1、不要なカッコを取り除く処理が (?: ) を取り去った
2、分岐の "|" の意味合いが変わってしまった

ということだね、原因が分かれば回避が簡単なのでこのまま放置でも良さそう
0709デフォルトの名無しさん
垢版 |
2018/11/09(金) 18:21:43.84ID:BZlL2mTg
perl5.14

# 1文字が2文字にマッチ
if ( "fi" =~ /\A\x{fb01}\z/i ){ print "true\n"; } else { print "false\n"; }
0713デフォルトの名無しさん
垢版 |
2018/11/10(土) 00:21:29.46ID:EY2CMtcP
# \d{0,} は 32766回 を超えてマッチ可能
my $str = "";
for ( $count = 0; $count < 33000; $count++)
{ $str = $str."0"; }
print "\$str\.length = " , length($str) , "\n";

if ( $str =~ /\A\d{0,}\z/ )
{ print "true\n"; } else { print "false\n"; }

# 結果
# $str.length = 33000
# true
0714デフォルトの名無しさん
垢版 |
2018/11/10(土) 18:21:06.77ID:EY2CMtcP
# 検索表現の途中にある \G をマッチさせる
my $str = 'abcde';
$str =~ /abc/g;
if ($str =~ /abc\Gd/){ print "true\n"; } else { print "false\n"; }
0715デフォルトの名無しさん
垢版 |
2018/11/13(火) 00:16:05.06ID:QabZTjVa
# (?1) の直前に (?i) を置いても効かない

if ( "Aa" =~ m/(?i)(A)(?1)/ )
{ print "true <$1>\n"; } else { print "false\n"; }
# 結果:true <A>

if ( "Aa" =~ m/(A)(?i)(?1)/ )
{ print "true <$1>\n"; } else { print "false\n"; }
# 結果:false
0716デフォルトの名無しさん
垢版 |
2018/11/13(火) 05:19:20.83ID:QabZTjVa
## (?{code}) を使って >>695 の置換
if ( "ybrybrb" =~ /
\A
(?|
(?<赤>r)(?{ "aka"; })
| (?<青>b)(?{ "ao"; })
| (?<黄>y)(?{ "ki"; })
)*
brybrb ## バックトラックに対応出来るか試す
\z
/x )
{ print "true. Color <${1}> is <${^R}> .\n"; } else { print "false.\n"; }
## 結果: true. Color <r> is <aka> .
## バックトラックの対応、成功
0717デフォルトの名無しさん
垢版 |
2018/11/13(火) 21:32:36.34ID:QabZTjVa
# 仲間外れを探せ
if ("\x{1990}" =~ /
\N{U+1990}
#\N{1990}
#\N{NEW TAI LUE LETTER HIGH NA}
/x){ print "match.\n"; } else { print "false.\n"; }
0718デフォルトの名無しさん
垢版 |
2018/11/14(水) 10:41:07.07ID:Hh1ptiAj
717
0720デフォルトの名無しさん
垢版 |
2018/11/14(水) 18:45:40.17ID:I91AeKub
このクイズだか検証だかよくわからんの書き連ねてるのは何なの?
一人で無意味に書き連ねてるの?誰かとやりとりしてるの?
0721デフォルトの名無しさん
垢版 |
2018/11/14(水) 23:41:31.78ID:cpUdYoRF
正規表現の勉強をしながら気付いたことをメモってるだけです
基本的には一人でやってます

仲間が欲しい...
0722デフォルトの名無しさん
垢版 |
2018/11/14(水) 23:44:34.67ID:CNd6PM4x
ここはお前のチラシの裏なのか

ある程度まとまってんならともかくメモ書きなら他所でやれよ
0725デフォルトの名無しさん
垢版 |
2018/11/16(金) 17:20:00.59ID:eADG8kUk
bregonig.dll の (?a)\w の処理速度が遅い

(?u)\w と同じ速さ
\s や \d や [a-zA-Z_] より4倍の遅い

改善の余地ありそうだね
0726デフォルトの名無しさん
垢版 |
2018/11/17(土) 03:22:15.33ID:YADh6pBI
## (?(R1)yes|no) のサンプルコード
if ("abc23yz" =~ /

\A
( # $1
( # $2
a(?1)z
|
b(?2)y
|
c(?(R1)1|2)(?(R2)3|4)
) # $2
) # $1

/x){ print "match. <$&> \n"; } else { print "false.\n"; }
# 結果: match. <abc23yz>

# aとzの間にあるcは (?1) の中でマッチしているが
# bとyの間でもあるため (?2) の中でもある
# この場合はcを直接覆っている (R2) だけがyesになる
# 直接でない (R1) はnoになる
0728デフォルトの名無しさん
垢版 |
2018/11/21(水) 19:34:31.80ID:CU3gUCH4
●Regular Expressionの使用環境
C#

●検索か置換か?
置換

●説明
先頭の全角スペースのみを置換したい
先頭の全角スペースは1文字の場合もある

●対象データ
   ああああ あ あ あ あ あ

●希望する結果
空空空ああああ あ あ あ あ あ
0732729
垢版 |
2018/11/22(木) 03:09:11.69ID:YAZbwzDX
>>731
たしかにそっちの方が倍くらい速かった
ちなみに正規表現関係ないけど

var trimed = str.TrimStart(' ');
var replaced = new string('空', str.Length - trimed.Length) + trimed;

とか

var sb = new StringBuilder(str);
for(int i = 0; i < sb.Length; i++) if (sb[i] == ' ') sb[i] = '空'; else break;

とかにするとさらに10倍以上速かった
正規表現使わないでもいい時はなるべく使わないほうがええね
0735デフォルトの名無しさん
垢版 |
2018/11/26(月) 06:49:56.12ID:OBhrl1nm
>>734
・・・っ、すごい。サクラエディタとかでも使える。
\Gのありがたみ知らなかった。私は、まだまだ精進が足りないようだ。
0736デフォルトの名無しさん
垢版 |
2018/11/27(火) 00:09:50.92ID:5gbDlA47
\Gを知らないのに正規表現を使いこなせるということはproxomitronのユーザーさんかな
0738デフォルトの名無しさん
垢版 |
2018/11/29(木) 02:42:35.12ID:Fz25AUlj
>>505-506
すごい

こういう書き込みが初心者の質問とその回答で埋もれてしまうのはもったいない
質問スレとは別に正規表現の本スレらしいスレがあるといいな
0743デフォルトの名無しさん
垢版 |
2018/12/08(土) 20:04:57.14ID:RNQqcEtu
アンド検索をしたいのですが、どう書けばいいでしょうか

^(?=.*あああ)(?=.*かかか).*$
このコードを見つけました

あああ と かかか の含まれる行がヒットします
ただ、ロジックがちょっとわかりません
先読みをつかっているのですが、先読み対象の語が指定されていません
これはどういうことでしょうか

分かりやすい解説サイトでもあれば教えてください
0744デフォルトの名無しさん
垢版 |
2018/12/08(土) 20:32:25.49ID:Dx33rAX6
このへんかな
>正規表現で論理積(AND)を実現する
>https://qiita.com/n4o847/items/dbcd0b8af3781d221424

自分流のちょっと乱暴な理解解釈だと
1. (?=検索対象) は、この条件が満たされないと後続のマッチを調べない
2. (?=検索対処) 自体は、この条件が満たされてた時点である意味消滅したかのようにふるまう
って動きを取るような感じ


ちなみにAND検索ができるgrepツール(TresGrep)がどんな正規表現を組み立てるか調べてみたら
「xxx&yyy&zzz」

「xxx.*?(yyy.*?zzz|zzz.*?yyy)|yyy.*?(xxx.*?zzz|zzz.*?xxx)|zzz.*?(xxx.*?yyy|yyy.*?xxx)」
なんてのを吐き出した
安直だけどまあこれも間違ってはいない
0745デフォルトの名無しさん
垢版 |
2018/12/08(土) 20:35:48.50ID:Dx33rAX6
あ、先読み対象の語は「^」だけで
「行頭から始まるという条件さえ満たせば何でもよい」と指定してる
0746デフォルトの名無しさん
垢版 |
2018/12/08(土) 22:19:09.33ID:7G2k61ed
環境が分からない
何を検索したいのか分からない

>先読みをつかっているのですが、先読み対象の語が指定されていません

??? 指定されてないって何のことだろう、意味不明
正規表現うんぬんの前にまともな質問の仕方を学ぶべき
0747デフォルトの名無しさん
垢版 |
2018/12/08(土) 22:26:59.96ID:RNQqcEtu
>>744
先読み対象は行頭ということですね
^(?=.*あああ)
これだと意味としては
「あああの前に行頭が存在すればヒット」
ということになると思います

これってもう少しかみ砕いた表現にできませんか?
まだ、理解が追い付いてないです

行頭が存在すればヒットということは、「行の中にあああがあればヒット」と同じことですか?
0748デフォルトの名無しさん
垢版 |
2018/12/08(土) 23:05:31.04ID:hZepSGXS
>>747
^は検索位置を示すもので、先頭を表す記号、
(?=)は先読みで検索開始位置を移動しないもの
つまり、
^(?=.*あああ)
は、先頭から(改行までの間に)文字列「あああ」がある場合
(先読みなのでマッチ後も次の検索開始位置はまだ先頭のまま)

よって
^(?=.*あああ)(?=.*かかか)
は、先頭から(改行までの間に)「あああ」があり、且つ先頭から「かかか」がある場合
.*$は不要だが、付けると、改行が存在すると絶対マッチしなくなる点が異なる
0749デフォルトの名無しさん
垢版 |
2018/12/09(日) 06:54:41.50ID:C3Qast1U
↑かっこを二つならべると、()と()という感じで、アンドになるんでしょうか?
あと
(?=)は先読みで検索開始位置を移動しないもの
の部分なんですが、検索開始位置を移動しないというのはどういうことでしょうか
?=キーワード
で設定した場合、キーワードの相対位置から前を検索する、という認識でした
0750デフォルトの名無しさん
垢版 |
2018/12/09(日) 08:43:46.17ID:UT294bNs
質問者は正規表現の基礎知識が足りてないと思われる
たとえるなら、(?=)の先読みは高校受験レベルで求められる英文法だとすると
質問者の場合は入門レベル(そもそもの基本ルールとか「.*」とか)の知識がごそっと抜けてる

なのでここまで出てきた説明を読んでもちんぷんかんぷんにしかならないのだろう
ちょっと遠回りになるけどちゃんと正規表現の基礎を理解したほうがいい
https://qiita.com/jnchito/items/893c887fbf19e17d3ff9
あたりを最終回(その4)まで読め
それでも理解できないなら、貴方には正規表現を扱うのは無理だからあきらめろ
0751デフォルトの名無しさん
垢版 |
2018/12/09(日) 09:50:40.98ID:vJutpfX/
>>749
()()でandになるわけではなく、()の次に()があるかどうかとなる(順序関係ができている)
^(a)(b)と書くと、abにはマッチするがaやbやbaにはマッチしない
これは、^(a)がマッチした時点で検索位置がaの次に移動しているためである
^(?=a)(b)と書くと、何もマッチしなくなる
これは先頭からaが見つかった場合、検索開始位置が移動しないため(?=a)を検索する前のまま(つまり先頭)になっている
次にbが先頭にあればいいわけだがそこにはaがあるからマッチしない
0752デフォルトの名無しさん
垢版 |
2018/12/09(日) 10:39:42.84ID:bsA2M6bZ
ID:vJutpfX/

頭が良すぎて教えるのが下手なパターン
バカ語で話さないと通じないよ
0753デフォルトの名無しさん
垢版 |
2018/12/09(日) 10:51:59.84ID:bsA2M6bZ
こんな最低限のこともググらず、自分で努力せずに人に聞くようなのに
教えてはいけないと思う、居ついてしまうからエサを与えないで欲しい
0755デフォルトの名無しさん
垢版 |
2018/12/09(日) 12:38:27.41ID:H3JhKeet
動かしながら覚えるんじゃなくて
>>750でも何でも良いけど、説明読んで覚えて欲しい
中途半端な事してるから、>>749みたいに間違った解釈になるんでしょ
0756744
垢版 |
2018/12/09(日) 19:23:00.27ID:i2SuH64K
うーん、一応はレス内容から質問者がどの程度内容を理解したか/理解する気でいるか
透けて見えるんだけどね
>>744のURLの記事を読んだうえでこの程度のレスしか返ってこず、さらに
最終的には>>754のようなリアクションが返ってきたか

回答して残念な気持ちになったよ
0757デフォルトの名無しさん
垢版 |
2018/12/09(日) 19:57:20.13ID:sTKdTIE5
位置の理解は言うほど易しくはないとおもわれ
正規表現検索とはテキストエディタでカーソルを1つずつ進めながら
合致する文字を1文字ずつ探っていくようなものだというイメージが必要だけど
そこをちゃんと説明してるものはあまり見かけない
0759デフォルトの名無しさん
垢版 |
2018/12/09(日) 21:49:11.61ID:bsA2M6bZ
回答した人は親切丁寧に回答出来ていたよ、お疲れ様
上にも書いたように頭のいい人にしか理解出来ない回答になっていた
俗にいう分かってる人にしか分からない説明ってやつ

俺はこういうバカに教えるのは得意だから俺が回答を付ければ理解されたと
思うけど注意をスルーされたのでスルーした
0760デフォルトの名無しさん
垢版 |
2018/12/10(月) 14:42:13.07ID:RU/iAdEK
知恵袋で質問を4000件以上やりとりしてる人だったのか
それなのに質問の仕方がまったくダメって
0761デフォルトの名無しさん
垢版 |
2018/12/10(月) 17:07:38.24ID:RU/iAdEK
質問のペースがおかしい、1日に質問6つしてる
ググるより先に質問してんのか?
0764デフォルトの名無しさん
垢版 |
2018/12/10(月) 17:29:58.71ID:RU/iAdEK
やっぱ質問スレと本スレは分けるべきだな
この流れになると賢い人が来なくなってしまう
0765729
垢版 |
2018/12/10(月) 18:14:05.41ID:PtRqcV9k
なんで馬鹿が一匹きただけでそういう話になるんだよ
過剰対応の典型やろ
0766デフォルトの名無しさん
垢版 |
2018/12/10(月) 21:59:56.06ID:RU/iAdEK
入門サイトすら読んでないような人の質問とその回答にうんざりして
来なくなった人は大勢いると思うんだがそういう人達が集まれるスレが
あったらひょっとしたらすごいスレになるんじゃないかという期待がある
実際はただ過疎るだけなんだろうけどね
0770デフォルトの名無しさん
垢版 |
2018/12/14(金) 20:59:53.53ID:DlmPms4F
^
(?:
(?!あああ|かかか).
)*+
(?>
(あああ)
|
かかか
)
(?:
(?!あああ|かかか).
)*+
(?(1)かかか|あああ)
.*+$
0771デフォルトの名無しさん
垢版 |
2018/12/14(金) 21:11:35.41ID:DlmPms4F
^
(?~あああ|かかか)
(?>
(あああ)
|
かかか
)
(?~あああ|かかか)
(?(1)かかか|あああ)
.*$
0774デフォルトの名無しさん
垢版 |
2019/01/10(木) 15:21:01.00ID:Q3mhk3sM
>>772
chrome on mac だけどブックマークではダメで、設定→検索エンジン→検索エンジンの管理→追加 から登録しないといけなかったわ。
0776デフォルトの名無しさん
垢版 |
2019/01/26(土) 10:17:12.64ID:rNPVIr5d
否定先読み
と言うのがなかなか理解出来ないのですが、
サンプルを動かすと確かに動作するのですが、
今一つ仕組みが分かりません。
どんなふうに理解すれば良いのでしょうか?
0777729
垢版 |
2019/01/26(土) 10:42:36.00ID:K4a4emwR
文字じゃなくて位置(文字と文字の間)に一致すると考えればいい
たとえば

abcdef

が対象の場合
肯定先読み(?=def)は直後にdefがある位置(cとdの間の位置)に一致する

abc[ここ]def

否定先読み(?!def)は直後にdefがない位置に一致する

[ここ]a[ここ]b[ここ]cd[ここ]e[ここ]f[ここ]

行頭の^や行末の$も文字じゃなくて位置に一致する
0778デフォルトの名無しさん
垢版 |
2019/01/26(土) 11:13:09.45ID:yVAkGzul
なるほどthx
0779デフォルトの名無しさん
垢版 |
2019/01/26(土) 11:53:37.94ID:mL4if6wW
>>777
横からだけど、否定のほうはなるほどだわ
条件を絞るつもりが広げちゃってる場合があるんだな
0780デフォルトの名無しさん
垢版 |
2019/01/26(土) 15:19:07.07ID:exLOU4gz
先読みはマッチさせたら、マッチ開始位置に戻るから、
単なる位置指定で、幅を持たない。
単なる条件を追加した、フィルター

否定先読みはマッチしない場合に、マッチ開始位置に戻る

先読みは、マッチ位置の直後の条件を指定するが、
戻り読みは、マッチ位置の直前の条件を指定する
0781デフォルトの名無しさん
垢版 |
2019/01/27(日) 10:46:10.47ID:Th+zYLMn
>>777
ありがとうございました。
良く分かりました。
0782デフォルトの名無しさん
垢版 |
2019/01/28(月) 10:47:47.80ID:wg8XKdax
.netでの正規表現に迷ってます。
次の文字列のとき、"efgh/1"以降に"/"が含まれないときマッチするような正規表現を書きたいのです。
http://192.168.1.100/abcd/efgh/1  →True
http://192.168.1.100/abcd/efgh/1/ →False
http://192.168.1.100/abcd/efgh/12  →True
http://192.168.1.100/abcd/efgh/123/  →False
http://192.168.1.100/abcd/efgh/1?p=1  →True

次のような正規表現を試してみましたが、数値1文字しか対応できませんでした。
\/efgh\/[0-9]+(?!\/)
0784デフォルトの名無しさん
垢版 |
2019/01/28(月) 12:18:39.25ID:c4Y7c3OH
>>783でいいと思う
あとスラッシュにエスケープは不要だから/efgh/1[^/]*$
否定先読みが使いたいなら /efgh/[0-9]+(?!.*/)
(?!.*/)はそれ以降/が含まれない位置という意味
(?!/)だと直後に/がない位置という意味だから数字が2文字以上続いたらマッチしてしまう
0786782
垢版 |
2019/01/28(月) 15:51:48.42ID:wg8XKdax
>>783-785
ありがとうございます!
正しい判断をすることが出来ました。
数値は1以外もありえるため、次の正規表現を使います。
/efgh/[0-9][^/]*$
/efgh/[0-9](?!.*/)

>>784
正規表現の意味まで教えてもらい、本当に助かります。
今後の役に立てていきます。
0788デフォルトの名無しさん
垢版 |
2019/01/29(火) 06:32:49.85ID:mzqJgDrY
Tools for Working with Regular Expressions
RegexBuddy
RegexPal
RegexMagic

More Online Regex Testers
RegexPlanet
regex.larsolavtorvik.com
Nregex
Rubular
myregexp.com

More Desktop Regular Expression Testers
Expresso
The Regulator
SDL Regex Fuzzer
PowerGREP
Windows Grep
RegexRenamer
0791デフォルトの名無しさん
垢版 |
2019/02/13(水) 00:35:05.11ID:HRhgNpoV
鬼雲には鬼雲を知ろうとすればするほど謎のテキストエディタの
情報が集まってくるという不思議な不具合があるがこのフィックスは不可能 :-)
0792デフォルトの名無しさん
垢版 |
2019/03/07(木) 20:57:23.09ID:sEA+6w2y
今日元号の改正の準備で日付関連のコード書いてきたんだけど
>>695の置換が出来ると便利だったなという所があった
再帰が使えるのにこれが使えないのはバランス感覚に欠ける気がします
どうしてこうなった?
0793デフォルトの名無しさん
垢版 |
2019/03/12(火) 13:14:07.01ID:vSZ9R6NM
先読みの(?=huge)をつけると、後方がキャプチャーされません

そもそも前方に文字のない?=って使い方あってるでしょうか?
ちなみに言語はVB6です
0795デフォルトの名無しさん
垢版 |
2019/03/13(水) 01:39:37.63ID:bUFEpZHr
あなたの英語も変ですよ。
日本人はJapaneseとキャピタライズしてください。
日本語もjapan languageではなくJapanese languageです。
Japaneseだけで日本語という意味になりますが、前の文で日本人という意味で使っているのでlanguageを付けるのはいい判断でした。
また最後の文は、どうしても複数の例を見たいことを強調するのでない限りcodesではなくのcodeがふつうです。
不定冠詞のaも付けません。(絶対にただひとつの例だけ欲しいのでない限り)
0797デフォルトの名無しさん
垢版 |
2019/03/13(水) 02:29:04.73ID:Z/ka/TFK
irregular expression, exactly.
0799デフォルトの名無しさん
垢版 |
2019/03/13(水) 14:12:32.68ID:ZUOT1OTB
nativeのひとに「あなた英語上手ですね」って言われても誉め言葉じゃないからな
その時点で下に観られてる
0801デフォルトの名無しさん
垢版 |
2019/04/22(月) 20:21:53.32ID:GQt1LKrG
sed
置換
1に挟まれたN個以下の0または-で構成された文字列を、同数の1で置き換える

10001→11111
100-1→11111
1---1→11111
10-0-0001→111111111

置換対象と同数の文字列で置換するというところをどう正規表現で表すかわからず、、、
よろしくお願いします
0802デフォルトの名無しさん
垢版 |
2019/04/23(火) 05:37:05.12ID:TbAsj7lM
正規表現で数を数えるのは無理
マッチさせて自力で文字を数えるコード書いて入れ替えて

ちなみに\Gが使える正規表現環境なら正規表現単独で可能
0803デフォルトの名無しさん
垢版 |
2019/04/23(火) 07:05:11.04ID:k/th3sVe
>>801
sed ':r; s/1[0-]\([0-]*1\)/11\1/; tr'

前方に 1 のある 10 を 11 に置換する
置換に成功したら tラベル で :ラベル の位置に戻って繰り返す
0804デフォルトの名無しさん
垢版 |
2019/04/23(火) 08:49:46.57ID:ef59e0DS
>>801
たぶんこれだけでは不要なところを置換しそう
:a;s/1([^0\-]*)(?:[0\-])(.*)1/1$11$21/g;t a
例題をこなすのは確認
0805デフォルトの名無しさん
垢版 |
2019/04/23(火) 10:21:33.54ID:yIB0exXp
>>801
100010
とか
1000101
とか
があるのか?
あった場合はどうすべきか
そこは明記しような。
謎だらけの設計書書く奴はIT向いてない。
0806デフォルトの名無しさん
垢版 |
2019/04/23(火) 11:46:04.64ID:ef59e0DS
>>805
>>804で> 100010→111110、> 1000101→1111111は確認

というかオレは前後にゴミがつくことは何ら影響がある題とは思わなかった
>>801の「1に挟まれたN個以下の0または-で構成された文字列を、同数の1で置き換える」にはその前後について言及ないから「触らない」と判断

後者を1000101→1111101で求めるかという点は気になるところ
最初の1〜1ブロックのみなのか、行中の1〜1最長一致ブロックなのか(すべての1〜1ブロックを個別処理も同一)
0807デフォルトの名無しさん
垢版 |
2019/04/23(火) 12:07:17.02ID:yIB0exXp
>>806
()で囲うとなってれば入れ子のケースは当然問題になるんだから
入れ子を考慮する必要があるかを明確に定義してないのは駄目な仕様。

10-以外が現れた場合の扱いも明記されていない
→現れることはないとみなしている
んだから
100010は現れないと想定して書く選択肢もある。
いずれにしろ、不明瞭な仕様を書く奴は無能だし、
勝手に解釈するのも実際の仕事じゃトラブルの元。
0808デフォルトの名無しさん
垢版 |
2019/04/23(火) 12:23:27.03ID:ZY45SR7V
Ruby なら、

re = /1([^1]+)1/ # 1〜1 で、はさまれた部分

str = "x10-0y0-1x"

# $1 は、capture 部分で、0-0y0-。この部分を置換する。
# 結果は、x1 (111y11) 1x
p str.sub( re ) { |s| "1" + $1.gsub( /[0-]/, "1" ) + "1" }
0809デフォルトの名無しさん
垢版 |
2019/04/23(火) 12:38:52.51ID:ef59e0DS
>>807
反論と取られたのかな
反論でも賛意でもないよ

個人的には>>801が「よい定義や仕様」とは欠片も思わない一方で「ダメダメ」とも思わない
組んでいく中で詳細を詰めていくことも現実としてある
あなたが求めているようながっちり仕様が決まっていたらむしろやることなんてほぼないかも
単に日本語を翻訳する作業になるのでむしろ苦痛かな…
そこまで詰められるなら日本語で指示しないで自分で書けよと思ってしまうかも

スレ的に読み替えればがっちり仕様を出した上で「これは正規表現で可能か?」という命題に繋がるのでスレでがっちり仕様を出すなと言う意味ではないです(念為)

仕事でもなし頭の体操的にてきとーに答えてるだけなんでこれくらいなら気にしない派
0810デフォルトの名無しさん
垢版 |
2019/04/23(火) 13:02:53.90ID:k/th3sVe
% printf '100010\n1000101\n' | sed ':r; s/1[0-]\([0-]*1\)/11\1\n/; tr; s/\n//g'
111110
1111101
%
0811801
垢版 |
2019/04/23(火) 13:49:39.47ID:CFFnqXFD
問題が曖昧であったため議論を紛糾させてしまいました。すみません。
たしかに入れ子のことや、一致する最初の文字列か、最長か、01-以外の文字の存在などを明確に記載できていませんでした。
今回の問題で聞きたかったことをシンプルに表現すると、検索文字列の文字数(1〜N個)に依存した置換が可能なのか、になります。
そこについては先の人が回答してくださった通り、文字数を記憶しておくような処理は不可能であるから正規表現の範疇ではないと思いました。
これまでの意見から当初目的ではないものの多くのヒントをもらいました。ありがとうございました。
問題提示者としていたらないながら、この話はクローズさせていただきます。
0812デフォルトの名無しさん
垢版 |
2019/04/23(火) 13:52:46.13ID:yIB0exXp
>>809
反論だなんて受取ってないから妄想やめて。
定義が曖昧過ぎてねえ…
としか言ってないから。

01-以外でいいのか、1.*1でいいのか
などなど要件がこんな不明瞭じゃねえ

と言う話しかしてないのであしからず。
0813デフォルトの名無しさん
垢版 |
2019/04/23(火) 13:54:41.14ID:yIB0exXp
>>809
というか、そもそもお前宛じゃないのに
なんでお前が絡んで来てるのか謎。
勝手にお前が批判されたと妄想するなよ。
0814デフォルトの名無しさん
垢版 |
2019/04/23(火) 15:45:58.43ID:ef59e0DS
>>813
> というか、そもそもお前宛じゃないのに
ふあ?
>>807(ID:yIB0exXp)で>>806(ID:ef59e0DS)に安価されてるからですよ
んーなんなんかな(´д`)
0815デフォルトの名無しさん
垢版 |
2019/04/23(火) 17:14:05.07ID:yIB0exXp
>>814
>>805のことだが。
お前宛じゃないのに絡んで来たのお前だろ。
記憶喪失ワロタw
0817デフォルトの名無しさん
垢版 |
2019/04/23(火) 19:41:58.96ID:ef59e0DS
>>815
あーきみがいいたいのはそっちか
例題をこなす正規表現を提示している>>803,804宛と捉えたんだよね
すでに>>803,804出てるのになにも提示してないでぐちぐち言ってるんで

まあ気に障ったようなので安価張って絡んだ形になったのは謝るよ
0818デフォルトの名無しさん
垢版 |
2019/04/23(火) 19:46:57.33ID:yIB0exXp
>>817
>>805>>801宛だと明示してるし
>>803>>804なんてどこにも書かれていないのに勝手に勘違いされてもさあ。
どこをどう見たってお前が勝手に絡んで来てるのに
「絡んだ形」とかふざけた言い方すんなよ。
0819デフォルトの名無しさん
垢版 |
2019/04/24(水) 19:37:45.85ID:kN2xWSes
質問者の例題は数に応じた置換の簡単なサンプルが欲しくて書いたものだと思う
再帰的に無理やり導くクソコードなんて書かれても迷惑なだけでしょ
0821デフォルトの名無しさん
垢版 |
2019/04/25(木) 02:00:13.99ID:nkf4NYVZ
pythonスレで似たテーマ観たからマルチ認定
0822デフォルトの名無しさん
垢版 |
2019/04/26(金) 22:15:29.45ID:pXwlHtT3
sedとpythonじゃまるで違うから別件だろうな

>>817
勘違いして迷惑かけた分際で「ぐちぐち」って言葉を使うか普通..

というかこの文体、昔セガBBSにいた南瓜さんという人にそっくりだな
別人だろうけど思い出してワロタ
0825デフォルトの名無しさん
垢版 |
2019/04/27(土) 13:12:59.58ID:W9D3URJl
オブジェクト指向最高さんは今回まったく落ち度が無い
迷惑かけといて素直に謝ることも出来ないくそコード製造機はもう来なくていい
0826デフォルトの名無しさん
垢版 |
2019/04/27(土) 21:25:24.59ID:CxhHumup
翌日以降もこんな感じですよ
ttp://hissi.org/read.php/tech/20190424/M1dYN3QzOXA.html
ttp://hissi.org/read.php/tech/20190425/VThrOUNyV3U.html
ttp://hissi.org/read.php/tech/20190426/NGZaS2JZWkg.html
ttp://hissi.org/read.php/tech/20190427/QzZmMHJVWmE.html
こちらで引き取ってもらえませんか?
0828デフォルトの名無しさん
垢版 |
2019/05/29(水) 23:29:43.55ID:NoMeOMsF
よろしくお願い致します。

●Regular Expressionの使用環境
Python 3.7

●検索か置換か?
検索

●説明
3つ目と4つ目のダブルクオートの間の文字列を探す

●対象データ
"文字列1":[1000:"文字列2"]

●希望する結果
文字列2
0830デフォルトの名無しさん
垢版 |
2019/05/30(木) 08:48:50.22ID:ZbLZAkBS
>>829
文字列1が空だと空振るのでいっそベタ書きするかな
それと対象の規模によっては計算量も30%少なくて済む
"[^"]*"[^"]*"([^"]*)"

くどいーと思ってまとめてみても
"(?:[^"]*"){2}([^"]*)"
若干悪化して15%offくらいに留まる
0831デフォルトの名無しさん
垢版 |
2019/05/30(木) 09:14:01.64ID:js+SNbQS
やっぱり可変長の戻り読み使えないなら後方参照で抜き出すしかないよね
というか正規表現以外で抜き出した方が処理軽いんじゃ
0832デフォルトの名無しさん
垢版 |
2019/05/30(木) 10:41:49.43ID:NTWA4E5y
>>830
> 文字列1が空だと空振るのでいっそベタ書きするかな
空振るの意味がよくわからん
効率は考えてない
0833デフォルトの名無しさん
垢版 |
2019/05/30(木) 16:00:31.98ID:0UuZnvit
>>832
皆様、ありがとうございます。
>>829にてご提案頂いたものに、Pythonのエスケープシーケンスを加えて採用しました。
ほか、ご提案頂いたものも大変勉強になりました。
0834デフォルトの名無しさん
垢版 |
2019/06/12(水) 18:51:34.75ID:8qMgnvIv
正規表現で全角記号だけ抜き出す事はできますか?
★ファイル名 
みたいにして先頭に来るようにしてたんですが、全角記号はエラーおこすことがあるようです
0837デフォルトの名無しさん
垢版 |
2019/06/17(月) 00:16:17.89ID:ks+4WGLz
助けてください。おながいします

●Regular Expressionの使用環境
Sakura Editor
(begonig.dll ver.3.06 with Onigmo 5.15.0)

●検索か置換か?
検索

●説明
日本語の文章の中に、全角英字が混じっています。
「全角英字の単語直後の任意の1文字」をマッチさせたいです。

(?<=[a-zA-Z]+).
でいけると思ったのですが、invalid pattern in look-behindでエラーになってしまいます。
どうもDLLの仕様で肯定後読みの式は固定文字長でなければならないらしく、代替案がないかなーと……

●対象データ
ああいいいabcうABCえおかきくけ

●希望する結果
「う」、「え」の2か所
0839デフォルトの名無しさん
垢版 |
2019/06/17(月) 06:40:06.13ID:LXSfy5ij
>>837
> 「全角英字の単語直後の任意の1文字」

> ああいいいabcうABCえおかきくけ
bcうBCえ

> 「う」、「え」の2か所
任意とは
0840デフォルトの名無しさん
垢版 |
2019/06/17(月) 21:52:38.33ID:ks+4WGLz
>>838
天才!天才!解決しました。大量に感謝
発想が . に囚われていた……勉強になります

>>839
単語というのが1文字じゃなくて英字で構成されたブロックの〜という意味でした。わかりにくくてスマソ
0841デフォルトの名無しさん
垢版 |
2019/06/18(火) 22:51:14.09ID:y1gFJJpS
ちょっとした疑問
アラビア語のような右書き言葉だと正規表現をどう書くのだろう
文字列も正規表現も右書きだから、/xyz$/ は /$zyx/ ?

(レス不要です)
0843デフォルトの名無しさん
垢版 |
2019/06/19(水) 14:27:57.27ID:Yoy0IPRe
いし正が左らか右は語本日
0844デフォルトの名無しさん
垢版 |
2019/06/23(日) 22:51:37.03ID:WHM6Ibwm
>>834
理論上は
|
で全部やればできる


ちょうど単なる全角(
1文字が2つの幅をもつ
ロシアの言語なども2幅
)
を捉えようとしていたので道具を紹介
https://i.imgur.com/9l39lUv.jpg
正規表現は (.) で1文字を習得し
バイト数が1でないものを拾うロジック
0845デフォルトの名無しさん
垢版 |
2019/06/24(月) 06:26:17.63ID:F4CLQWNj
ttps://so-zou.jp/software/tech/programming/tech/regular-expression/meta-character/variable-width-encoding.htm
こういうので全角記号だけさっくり選ばせろって事なんだろうけど
全角半角はユニコードだとフォント依存なので曖昧
ascii 以外って意味で言ってるんだろうけど
恐らく"ファイル名"て事からSJisの範疇外の文字って事かなと
0846デフォルトの名無しさん
垢版 |
2019/06/24(月) 21:23:57.79ID:4+LiJo6+
一文字決めうち かつ あらっぽいコレクション
vim の :h digraphs には結構ある
[??????????▲△??▼▽??◆◇?○◎●??????★☆?????♀♂?????♪?♭?♯??? 、。〃?々〆〇《》]
0847デフォルトの名無しさん
垢版 |
2019/06/24(月) 21:24:32.12ID:4+LiJo6+
[??????????▲△??▼▽??◇?○◎●??????★☆?????♀♂?????♪?♭?♯??? 、。〃?々〆〇《》]
0848デフォルトの名無しさん
垢版 |
2019/06/24(月) 21:24:52.95ID:4+LiJo6+
[??????????△??▼▽??◆◇?○◎●??????★☆?????♀♂?????♪?♭?♯??? 、。〃?々〆〇《》]
0849デフォルトの名無しさん
垢版 |
2019/06/24(月) 21:28:31.79ID:4+LiJo6+
おわった
NG word 群が正規表現を妨げる

一文字限定なら [] の処理が早い
vim の :h digraphs
には 1300個ぐらいの 記号を含むデータリストがあるから
それから組みたてやすい とおもう
0851デフォルトの名無しさん
垢版 |
2019/06/24(月) 23:17:52.70ID:4+LiJo6+
そういえばブラウザに NG word に指定したのは自分だった
あらしが記号を使ってたことがあったので
0854デフォルトの名無しさん
垢版 |
2019/07/08(月) 00:38:09.05ID:m6vFYfK4
●Regular Expressionの使用環境
サクラエディタ(か秀丸エディタ)

●検索か置換か?
置換

●説明
不定回数のパターンを置換したい。


●対象データ
[A=a,A=b,A=c,A=d,・・・・]
・・・・の部分はどこまで続くのかは決まってない。が、多くても20個くらい

●希望する結果
A=a,b,c,d・・・・
0856854
垢版 |
2019/07/08(月) 23:27:17.45ID:Rb/08H3f
>>855
ありがとうございます。
否定戻り読みってこうやって使うのですね。

もうちょっと深掘りして以下の場合どのようになるでしょう。
■対象データ
[A=a OR A=b OR A=c OR A=d・・・・]
[B=d OR B=c OR B=b OR B=a・・・・]
[C=a OR C=b OR C=c OR C=d・・・・]

■希望結果
A=a,b,c,d
B=d,c,b,a
C=a,b,c,d

ORの部分が難しくて混乱しています。。
0858デフォルトの名無しさん
垢版 |
2019/07/10(水) 09:18:54.80ID:StxWbt+s
ここの住民の正規表現能力は超人的だ
お節介させてくれ
もし使用環境に perl があれば、
ウルトラ難しい正規表現を理解可能な小さなパーツに分類できる

cat /dev/clipboard
[A=a OR A=b OR A=c OR A=d・・・・]
[B=d OR B=c OR B=b OR B=a・・・・]
[C=a OR C=b OR C=c OR C=d・・・・]

cat /dev/clipboard | perl -ne 'if ( m{^ \[ ( \w+ [=] ) }xcm) {print $1}; { if ( m{ = (\w+) \s }xcg ) {print "$1,"; redo} if ( m{ = (\w+) \S }xc ) {print "$1\n"} }'
A=a,b,c,d
B=d,c,b,a
C=a,b,c,d
0859デフォルトの名無しさん
垢版 |
2019/07/10(水) 09:35:40.67ID:StxWbt+s
そして同じような形を処理するのに
必要な正規表現が大きく変わったりしない

cat /dev/clipboard
[A=a,A=b,A=c,A=d,A=e,A=f,A=g,A=h,A=i,A=j]

cat /dev/clipboard | perl -ne 'if ( m{^ \[ ( \w+ [=] ) }xcm) {print $1}; { if ( m{ = ( \w+ [,] ) }cxg ) {print "$1"; redo} if ( m{ = (\w+) [^,] }xc ) {print "$1\n"} }'
A=a,b,c,d,e,f,g,h,i,j
0860854
垢版 |
2019/07/11(木) 01:01:12.77ID:/KpWZOtx
>>857
すごい。。
置換できましたありがとうございます。

が、情けない話ですがなぜこういう置換結果になるのかが理解できません。
良ければどなたか解説いただけないでしょうか

>>858
ほんと、超人的ですね。。

Perlでのご教授ありがとうございます。
1度組んでしまえば汎用的に使えそうですね。
0862デフォルトの名無しさん
垢版 |
2019/07/13(土) 20:47:25.54ID:57lWPs8z
動作についての質問です。よろしくお願いします。

●Regular Expressionの使用環境
JavaScript (chrome)

●検索か置換か?
検索

●説明
'@time;prop1:style1;prop2:style2'.match(/(^|[@;])[^@;]*/g); が
["", ";prop1:style1", ";prop2:style2"] になる理由が分かりません。私の理解では、
["", "@time",";prop1:style1", ";prop2:style2"] となって欲しいところです。
どなたか説明お願いします。
^は文字列検索位置を「動かさない」と認識しています。
(以前は「動かす」と誤認識していましたが、何かで見解を改められたことを記憶しています)

●対象データ
ID@time;style 形式の指定で、
ID、time、styleの省略は全てありで、timeとstyleの順序は自由(IDは必ず先頭)
@開始はtime指定、それ以外はstyle指定とし、デリミタは ; としています。
この形式で任意の文字列(ユーザー入力)を処理します。
なお、'@time;prop1:style1;prop2:style2'.match(/(^.|[@;])[^@;]*/g); では希望の解
["@time", ";prop1:style1", ";prop2:style2"] を得られていますが、
デバッグ中に上記に引っかかったので、分かりましたらよろしくお願いいたします。
0865デフォルトの名無しさん
垢版 |
2019/07/14(日) 04:59:50.53ID:XILHsvHP
この質問内容ならここで合ってます、jsスレよりもこのスレ向きです
正規表現には統一規格みたいなものは存在しないので環境によって動作が異なります

このスレの住民なら2番目のマッチが t から始まる環境も想定します
["","time", ";prop1:style1", ";prop2:style2"]

詳しい仕様を知らなくても動作を確認するコードを作っていろいろ試すと
どう動く環境なのかだいたい分かってしまうことが多いです
0866デフォルトの名無しさん
垢版 |
2019/07/14(日) 08:17:29.28ID:LdVrbIxu
>>865
> 正規表現には統一規格みたいなものは存在しないので環境によって動作が異なります
これは知ってますがBREの範囲だと当然間違いなく動くし、
ほぼPCREに向けて統一中、といったところなのでは?
まあやたら複雑になってバックトラッキング等の問題が発生し、
結果的に速いライブラリに収束して行っているのはいいことだと思いますが。

> このスレの住民なら2番目のマッチが t から始まる環境も想定します
> ["","time", ";prop1:style1", ";prop2:style2"]
これは一応アウトなのでは?正規表現自体はデリミタごと取り込もうとしており、それが出来ていません。
これを言うならJavaScriptもアウトですが。

個人的にはJavaScriptは面白いのですが仕様がイマイチなところが散見されるのが難点ですね。
それが初心者に無用な混乱を引き起こし、上達の妨げになっている。
今回私も数時間無駄にしましたが、これが初心者だと脱出出来なくて誤解したままになってしまう。
そして本人はそれを自覚出来ず、Web上に間違った情報を垂れ流し、馬鹿が再生産されるというループになっている。

この意味では正規表現の現在の状況も同じようなものですが、
正規表現は「実装の幅がものすごくある」と共有されているだけまだましです。
JavaScriptの連中はその間違った実装を「正しい」と思いこんでいたりするので、会話が成立しません。
といってもJavaScriptのString.matchの仕様バグを今更直すことも出来ず、未来永劫このままだと思いますが。
0867デフォルトの名無しさん
垢版 |
2019/07/14(日) 10:58:08.46ID:wR6d2dgQ
PCREに向けて統一中なんてどんな根拠で喋ってんだ
regex101で試してみれば分かるけどPCRE使ってるPHP以外のPython, ECMAScript, Goは全滅だぞ
0868デフォルトの名無しさん
垢版 |
2019/07/14(日) 12:13:01.78ID:LdVrbIxu
>>867
ゴミという意味でだろ。
逆にお前はどう思ってるんだ?

JavaScriptのString.matchについては単にパッチを実装する場所を間違えただけ。
結果、String.match と RegExp.exec での結果が異なるという、言語内での不一致を引き起こしてる。
そしてこれはもう修正されることはない。
仕様バグとして永久に残り、プログラマに無駄な時間を消費させるだけのものとなる。
結果、言語が腐っていく。

正しくは RegExp.exec 側を修正し、両方とも無限ループにならずに
["", "@time",";prop1:style1", ";prop2:style2"]
を返すべきだった。
RegExp.lastIndex だけで状態管理出来ると「間違えた」からそうなった。
本来は先頭マッチフラグ RegExp.canMatchHead みたいなのが必要で、それを実装すれば両方とも正しい結果を返せた。
それを実装せず、String.match に間違ったパッチを当てたからそうなった。
これは実装者(おそらくブレンダンアイク本人)の判断ミスだ。

正規表現はPerlが再定義したと言っていい状況だ。だからみんなPCREを見てる。
PHPはさっさと取り込んだ。これは正しい判断だ。
JavaScriptはPCREを見てる。というか本来は取り込みたいのだろうが、上記のように今更部分がありすぎる。
Pythonには歴史的経緯があるのだろう、状況は知らん。
Goは最初から既にゴミだ。確実に廃れるだろうし、俺もそれを願っている。
そもそもGoなんてPCREが覇権取ったあとに出てきたのにPCREを採用してない時点でゴミ。
それ以外にもあの言語は独自路線を行き過ぎていて、ユーザーに無駄な勉強時間を強いている。
結果、既に他言語で慣らした強者が近づかず、結果的に馬鹿の楽園になってWeb系の馬鹿共に大受けしてるだけ。
Goの正規表現については詳しくは知らんが、仮にそれが奇妙な振る舞いをしたとして、お前はGo側の怠慢だと思わないのか?
JavaScriptやPython等それなりの歴史があるのならともかく、Goの場合は確実に防げた問題でしかない。
連中はそれを「わざと」やらなかったんだぞ。俺はそんな言語は支持しないし、ゴミだと何度でも断言する。

いずれにしても、今からの初心者が学ぶべきはPCREだろ。
お前は何が言いたいんだ?
0870デフォルトの名無しさん
垢版 |
2019/07/14(日) 13:05:26.62ID:LdVrbIxu
>>869
お前は実装と仕様の違いを理解出来てないタイプだな。


String.matchは「マッチ全部を配列で返す」メソッドだ。
当然、無限ループなんてしてはいけない。
(ただし無限ループしない為に空文字マッチだと一文字進めるパッチだから仕様バグになってるが)

RegExp.execは「gマッチを一つずつ実行し、ユーザーがそこで適宜処理を行う」為のメソッドだ。
当然、何もしなければ順に次のマッチをしていくのが正しく、今現在のように無限ループするようでは駄目だ。
結果、今はユーザーが本来不要なコードを毎回書く羽目になってる。
具体的に言えば、 if (match!=='') が毎回必要になる。これが無駄だ。

JavaScript界隈にはお前みたいな馬鹿が多い。
本来はどうあるべきか、或いは何故この無駄なコードが必要なのか分からず、
今の「実装」が正しいと思いこんでいるタイプだ。
動かさないと分からない、あるいは動いていればいい程度のコードしか書けないからだが。
とはいえ、今回のようなケースに遭遇するとそうなるのも分かる気はするが。


いずれにしても、これはJavaScript環境固有の問題で、ここでは割とどうでもいいと思うが。
お前が正規表現として /(^|[@;])[^@;]*/g を書いたとき、全ての環境で無限ループするべきだ!と思っているのならそれでいいが、
実際はそうではないだろ?なら無駄にいちゃもんつけるなよ。
0871デフォルトの名無しさん
垢版 |
2019/07/14(日) 13:21:26.40ID:XILHsvHP
>>866
"t" からマッチは誤りでした、申し訳ない..

タグの外側だけ対象に置換する
http://www.din.or.jp/~ohzaki/regex.htm#ReplaceOutside

この記事の動作のことを言いたかったんですがうろ覚えのまま
適当に書いてしまいました、ごめんなさい
0872デフォルトの名無しさん
垢版 |
2019/07/14(日) 13:28:58.74ID:wR6d2dgQ
>>868
PCREに統一中だという主張の根拠を聞いたんだがそれへの回答はないわけだ
PCREが素晴らしい実装で最初に触っとけばいいというのは同意するが, それが最良だなんてのはあり得ないし単なる妄想だよ
0873デフォルトの名無しさん
垢版 |
2019/07/14(日) 14:15:14.24ID:LdVrbIxu
>>871
ああなるほど、Perlも似たようなゴミ実装になってるな。

> そこで,Perl では空文字列に マッチするような場合には,初回は空文字列がマッチするがそれ以降は マッチせずに必ず 1文字分は進むようにマッチしようとする.
これも実装ミスだな。
正しくは、このフラグを「空文字以外のマッチごとにセット」すればいいだけで、修正は1行で済むのだが、こちらも今更なのだろう。
「初回は」というのが間違いで、「空文字にマッチした直後は」が正しい。
ついでにもっと具体的に言っておくと、「初回は」というのが正しければ、
今の実装は検索起動時にフラグをセットして空文字マッチ後にリセットしているはず。
このフラグを「空文字以外のマッチ後」に毎回セットし直すように1行入れる。これで直る。
君がPERL等のOSSか何かにcontributeする気があって修正案を出してくるのなら見てあげるけど。
(俺自身ではそこまでやる気はない)

まあしかし、JavaScriptだけがゴミじゃない、ってのは分かった。
というかもしかしてJavaScriptの実装ってPERL実装互換に敢えてしてる?



>>872
お前は何派なんだよ?
JavaScriptに関してはMDNでも前は「PCREで大体使えます」みたいな事書いてたぞ。
最近大幅リニューアルしてその記述はなくなったが。
(というより色々見にくくなってあまり確認してない)

鬼車派ならこの手の「実装ミス」をひたすら潰しておけばワンチャンあるかもしれんよ。
JavaScriptにしてもPerlにしてもこの辺のミスは確実に足枷になってる。
具体的に言うと遭遇した全プログラマが数時間ずつ無駄に検索その他をさせられる羽目になってる。
これは「新規プログラマ」からすると上達を妨げる障壁でしかない。
JavaScriptで言うと「IEデハー」な件を全部暗記してて今もそれにすがっている奴のウザさみたいなもんだ。
仕様バグがない、というのはそれなりに武器になる。
0874デフォルトの名無しさん
垢版 |
2019/07/14(日) 15:13:19.95ID:LdVrbIxu
>>867
今更regex101で確認してみたが、PCREだけは(これに関しては)正しく通るじゃねえかよ。

Perlの「初回は」というのはつまり g の時だけおかしくなるということであり、今回は当たらないからだが。
だからJavaScriptも仮にPerl実装互換にしようとしたとしてもしくってるな。


>>871
ちなみに
> > と < は後読みと先読みにして外に出すことができるので
の意味分かる?
おそらくはバックトラックを小さくする為(つまり高速化)だと思うのだが、
実際 regex101で試す限り余計に遅くなる。
テストサンプルはそこの下の「XMLタグを加工する」の上側半分のxmlで、こちらだと
(?:^|>)(.*?)(?:$|<) の場合は 29matches, 1277steps だが
(?:^|(?<=>))(.*?)(?:$|(?=<)) の場合は 29matches, 1875stepsで、余計に遅くなってる。
格好良くはないが別に $1$2$3 で置換しても問題ないと思うのだが。
0875デフォルトの名無しさん
垢版 |
2019/07/14(日) 15:29:05.53ID:XILHsvHP
>>874
> > と < は後読みと先読みにして外に出すことができるので

これは文字を消費しないための措置
マッチさせたい部分以外の部分にまでマッチしてしまうと次回の
検索開始位置が意図しないところに進んでしまったりするので先読みを
使って消費しないようにします

あとあなたが言ってることにはおおむね同意です
変な挙動は無くなるといいですね、perl6に期待したいところだけど
perl6では出来る限り最長文字数のマッチを目指す挙動になると聞いたような..
自分にとっては処理が重くなるのであまり嬉しくないですね..
0876デフォルトの名無しさん
垢版 |
2019/07/14(日) 16:03:14.68ID:LdVrbIxu
>>875
ああなるほど、\G使ってるからずれるのか、確かに。

BRE出身だから個人的には最初から />[^<]*</ が第一選択肢で、
筆者の発想が意味不明だったのだが、確かにそうだな。
ここら辺は正規表現だけで何とか出来る(Perl)思想と、
BREだけではどうにもならないからざっくり切り出して自前でプログラミングする(AWK)思想の違いだな。

Perl6はガン無視されてる感があるけどね。
今更Perlで組めるかよ、というのはPerlを使っている奴自身が感じていることらしいし。
(もっとも嫌われてる言語がPerl、2017はダントツの一位、
しかし同じStackOverflow実施の2018の結果はVBでperlは落ち着いたようだが)
https://stackoverflow.blog/2017/10/31/disliked-programming-languages/
https://news.mynavi.jp/article/20180604-639227/
もしかしてPerl6って徐々に使われだしてる?

> perl6では出来る限り最長文字数のマッチを目指す挙動になると聞いたような..
ん?
全てのプログラミング言語では最長マッチがデフォ、
というかそもそも下位の正規表現(BRE等)にはそれしかないが。(non-greedyがない)
XPATH等の文書検索側の人かな?だからって別に特に問題はないが。
0877デフォルトの名無しさん
垢版 |
2019/07/15(月) 15:22:14.71ID:y88H95dP
Ruby で、

str = "@time;prop1:style1;prop2:style2"

re = /((^|[@;])[^@;]*)/

p results = str.scan( re )
# [["", ""], [";prop1:style1", ";"], [";prop2:style2", ";"]]

[ 0 ]がマッチした部分、[ 1 ]がキャプチャー部分

>>862
の、["", ";prop1:style1", ";prop2:style2"] と同じ結果
0878デフォルトの名無しさん
垢版 |
2019/07/15(月) 16:42:33.19ID:xqOJLOC2
>>877
テストしてくれたって事か?なら一応まとめておく。


/(^|[@;])[^@;]*/g に対してテスト文字列 '@time;prop1:style1;prop2:style2' で
PCRE: ["", "@time",";prop1:style1", ";prop2:style2"]
JavaScript, Python, Go, Ruby, : ["",";prop1:style1", ";prop2:style2"]

結論、PCRE以外全部ゴミ
現時点でPCREが最良だ馬鹿タレ >>872
お前が何派か知らんが、PCREが最良でないと言い張るのなら少なくとも通るライブラリを具体的に提示しろ


ただまあこれにはちょっと情状酌量の余地有りで、
おそらく ^ が「先頭文字」ではなく「位置」にマッチすると再定義したのはPerlだ。
そもそもBREには | がない。従って (^| のような「先頭の空文字」マッチなんて書けない。
だからBREだと先頭の「位置」なのか「文字」なのかを厳密に区別する必要がない。
| が導入されたのはEREからだが、EREなんて大して使われてない。
結果、BRE育ちの連中が「位置」だと厳密に認識せずにコーディングすると間違える、というわけ。
そしてJavaScript, Python, Go, Ruby は全滅だ。

JavaScriptに関してはPerlを模倣したわけでもなく、単なるミスだ。言語内不一致を生じているし。
他言語は知らん。

Rubyみたいに「実装が仕様だボケ」と言い張る糞言語ではこの手の仕様バグを永久に修正出来ない。
よって新人は毛嫌いして離れていく。当たり前の話だ。
JavaScriptはおそらくバグだと認識されているが、今更直せない。
Perl6はこの点、仕様と実装を分離したから、バージョンアップと共に確実に修正する。
従って最良は現時点でもPCREだし、今後ともPCREだ馬鹿タレ >>872
0879デフォルトの名無しさん
垢版 |
2019/07/15(月) 23:23:32.64ID:3MPTmFRg
BREの正規表現と今の正規表現の使い方の違いの話は面白いなぁ

しかしこの人こんなにすごいスキルとモチベがあるなら質問なんかせずに
自力でなんとか出来たのではw
質問してくれたおかげで面白い話をいろいろ聞けたからこちらは嬉しいけどネ

おかしな挙動と言えばperl5とOnigmoでは\Gの挙動に違いが
あってどちらかが違和感のある動作をしたはず
\Gの概念自体が微妙に違ったはずだけどメモるの忘れた
興味のある人はぐぐってね
0881デフォルトの名無しさん
垢版 |
2019/07/16(火) 16:08:47.84ID:cpfSTA9t
>JavaScript, Python, Go, Ruby, : ["",";prop1:style1", ";prop2:style2"]
深くて理解できないことが多いが、これはやばい気がする
0882デフォルトの名無しさん
垢版 |
2019/07/16(火) 17:23:30.54ID:hAAouWtx
読んでるだけで何も考えてなかったけど

/(^|[@;])[^@;]*/g

この書き方以外の書き方で意図した動作になるように書けないのかな
ここの人はこういうの得意だからもしかしたら・・?
0884デフォルトの名無しさん
垢版 |
2019/07/16(火) 19:27:45.24ID:hAAouWtx
言ってることに説得力がありすぎて聞き入ってしまってたよ
どんどん言いたいことを言って欲しい
昔のdanさんを思い出すなぁ
0885デフォルトの名無しさん
垢版 |
2019/07/16(火) 20:41:55.62ID:bFMew56o
入力フォーマットが正しいという前提で /@?[^@;]+/ の方が好み
そもそも正規表現使うより ; でsplitした方が良くね?とおm
0886デフォルトの名無しさん
垢版 |
2019/07/16(火) 21:03:17.33ID:hMJFhr7R
>>881
深くはない、単にバグってるだけ。
そしてそれはやばいどころではなく、全く話にならないレベルの物だ。使い物にならない。

例えば、図書館の蔵書をユーザーにも検索出来るようにしたとして、正規表現検索も選べるとしよう。
この場合、検索結果に現れないケースが発生することになり、使い物にならない。
プログラミング言語内の正規表現エンジンは「今までのプログラムが動かなくなる」危険があるからそうそう交換出来ないが、
図書館DBの検索フロントエンド内のエンジンなんて即交換可能なんだから、問題があればすぐ乗り換えられる。
PCREが気に入らないのならこんなところで無駄吠えするのではなく、
PCREがバグっているケース(例のタグ外側マッチとか)でもばっちり動く検索エンジンを提供して、乗り換えを待てばいいだけ。
現状、PCRE以外全部バグっているのだから救いようがないが。

JavaScriptの場合はatomエディターなる物があって、htmlやプログラムソースコードを編集出来るが、
JavaScriptの場合はreplaceもバグっているので、命中すれば、全置換しても全置換出来てないケースが発生する。
リファクタ等で変数名を変えるとき、手でやるとバグるので、当然エディタ機能で全置換させるわけだが、この場合にもバグる訳だ。
そしてユーザーはこのときに置換漏れが発生するとは全く思わないので、かなり手間取ることになる。
(atomでは対策されていると信じたい)

JavaScriptの場合はこのバグも「仕様」としてしまっているので、
逆に言えば仕様通りならバグに命中したときの挙動も確定してる。だから対策は出来るが、
Rubyみたいに「実装が仕様だ」と言い張る糞言語だとどういう挙動か確認してみなければ分からず、対策が出来ない。
ここらへんもRubyの思想は数周遅れている。

いずれにしてもこんな基本的なところのバグはあっても迷惑でしかなく、さっさと直せ、でしかない。
「速い」以前に「ヒットしない」エンジンなんて使い物にならないだろ。
エンジン競争しているつもりの馬鹿共も、方向性を完全に間違ってる。
「間違いなく動作する」エンジンを提供すれば、文書検索側の人間はサクッと乗り換えてくれるだろうさ。
速い遅いはその後の話だ。
0887デフォルトの名無しさん
垢版 |
2019/07/16(火) 21:18:41.35ID:hMJFhr7R
>>879
BREの場合はやりきる前提ではないので、例えば例のタグ外側マッチだと、
元の文字列に > と < を足してしまって置換し、出力時に削る、みたいなことをする。
具体的には以下。

('>' + str + '<').replace(/>[^<]*</,'>bar<').slice(1,-1)

だからBREしか使えないAWKでも意外と何とかなったりする。
ただしこれはプログラミング出来る前提であって、
Webページに検索窓だけ提供されているような状態ではどうにもならないが。


>>885
それは正しい。実際俺もそれに近いことをしている。
デリミタが最初に出現もあり、最後に付加もあり、つまり
';prop:style1' や
'prop:style1;prop:style2;' もありなので、
結局 /(^|[@;])[^@;]*/g だと後のコードが綺麗に書けなかった。 /(^.|[@;])[^@;]*/g でも同じ。
意味的には @ もデリミタ扱いしているだけなので、実もフタもないが、@を ;@にしてsplitした。
具体的には以下。
str.replace(/@/g,';@').split(';').filter(v=>v)
0889デフォルトの名無しさん
垢版 |
2019/07/17(水) 08:28:41.50ID:2/Bgill9
>>873訂正
俺は俺のケースだけ考えていたが、これだと871内URLの筆者のケースと合致しない。
そこで一応、両方とも合致する実装を考えてみた。
(といってもバグってる実装について推測すること自体はあまり意味がないが)

Perlはおそらく、^のフラグではなくて、空文字マッチ後のそのマッチ区間の*を+にしてる。
(というより筆者もそう言っているのだが俺が早とちりしてしまった)
871のケースだと、正規表現 (?:^|>)(.*?)(?:$|<) に対して、
1回目:(?:^|>)(.*?)(?:$|<)
2回目:(?:^|>)(.+?)(?:$|<)
というわけだ。結果、2回目は「先頭、<含んだ1文字、次の<まで、となり、
その筆者の説明通り先頭タグを含んで次タグ或いは文末まで伸びることになる。

俺のケースでは、正規表現 (^|[@;])[^@;]* に対して、
1回目:(^|[@;])[^@;]*
2回目:(^|[@;])[^@;]+
だから '@time;prop1:style1;prop2:style2' に対して @time のマッチも正しく取れることになる。

こういった場合、実装者は安全側に倒したくなる物だが、
現実は安全側に倒しすぎて余分なケースを含んでしまい、結果、バグっているというわけだ。
JavaScriptは最高に安全な実装、「空文字マッチは1文字進める」とした。(おそらくRubyその他もそう)
これだと絶対に無限ループはしないが、俺のケースでバグる。
Perlの実装だと俺のケースは通るが、871内URLの筆者のケースでバグる。
その他バグケースも出してくれれば俺の推測で合っているかどうかは答える。
0890デフォルトの名無しさん
垢版 |
2019/07/17(水) 08:28:59.00ID:2/Bgill9
正しい実装は、「経路全体」(つまりツリーのリーフ)に対してフラグを持たないといけない。
Perlは「区間」(=経路の一部)に対してフラグをつけてしまったところが間違いだ。
871のケース、単純化する為に (A0|A1)B(C0|C1)として、
1回目:A0BC1 で空文字マッチ
そして空文字マッチの場合はこれを記録し、これと同一の場合は次回以降はスキップする。
結果、2回目:最初に A0BC1 がマッチするがこれは捨てられ、次に A1BC0またはA1BC1となる。
そして非空文字マッチとなったので、この記録を全破棄して、同様にループを繰り返せばいい。

実装の修正は、探索関数そのものにだいぶ手を入れないといけないのでそれなりに大変だ。
まずは全部の最終段に「最終チェック」を入れて上記リストと照合、記載有ればマッチ失敗として探索継続、としなければならないが、
おそらくこれが1ヶ所では済まない。
ただしこれはリターンパスを辿ればいいので何らかのツールが有ればほぼ自動でいけるかもしれない。
次に上記リストを作成する為に全経路を出力させなければならない。
デバッグ用にこれが既にあればラッキーだが、なければ自前で作らなければいけない。
といっても内容はツリーのノードを辿るだけなので、ツリーのフォーマットが分かればすぐだが、
ゴリゴリに高速化とかしていると割と意味不明なコードになっていることが多いので、
その状態で確認するのは結構辛いとは思う。
リストの管理は、空文字マッチなら追記、非空文字マッチならクリア、なので、これはやるだけだ。
リストの管理も探索関数にやらせて、探索関数は
今:マッチ場所とマッチ長さを返す
修正後:マッチ場所とマッチ長さを含んだ『配列』を返す、とし、
「空文字マッチの場合は自動で継続、非空文字マッチまたは終了まで探索、まとめて配列で結果を返す」とするのがいいだろう。
0891デフォルトの名無しさん
垢版 |
2019/07/17(水) 08:29:16.56ID:2/Bgill9
なおPerlの実装だと『上位関数のみ』で対策できるため、
「取り敢えず1時間で直せ」と言われたらこうなるのも分からなくはない。
しかしいまだにそのままだというのは怠慢でしかないが。
JavaScript等も同様、『上位関数のみ』で対策出来るところで留まっている点からも、これは言える。
しかし現時点で世界中のプログラマがどれだけ無駄な時間を消費することになっているのかを考えれば、
こんなのは手間であろうがさっさと直せ、でしかないが。

いずれにしても、俺が修正してやる、修正案はこれだ!と具体的に出してくるのならレビューはする。
我こそは!という奴は頑張れ。
0892デフォルトの名無しさん
垢版 |
2019/07/17(水) 09:46:24.93ID:u050lnGw
話を単純化すると、
1. ある文字、例えば@ から、次の@ の直前の文字まで
2. 先頭が、@ でなければ、先頭から、@ の直前の文字まで。
つまり、先頭が、@ でなければ、先頭文字を、@ とみなして処理する

つまり、ルール1・2は、同時に適用させず、先にルール1を適用し、
ルール1に適用しないものだけを、ルール2に使う

(^|[@;])[^@;]*

だから、この正規表現がおかしい。
定義があいまいになる、解釈を含んでいる!

OR の部分が、並列ではない。
ルール1を優先すべき!
0893892
垢版 |
2019/07/17(水) 09:51:38.77ID:u050lnGw
(^|[@;])[^@;]*

OR を使うと、両方に該当する場合に、どちらの処理がされるのか、あいまい!
つまり、先頭文字が@; の場合に、両方に該当するので、処理があいまい!

A|B
A, B 両方に該当する場合に、A,B どちらの処理がされるのか、あいまい!
0895877
垢版 |
2019/07/17(水) 10:06:18.04ID:u050lnGw
>>889
Ruby で、

str = "@time;prop1:style1;prop2:style2"

re = /((^|[@;])[^@;]*)/

p results = str.scan( re )
# [["", ""], [";prop1:style1", ";"], [";prop2:style2", ";"]]

[ 0 ]がマッチした部分、[ 1 ]がキャプチャー部分

>>862
の、["", ";prop1:style1", ";prop2:style2"] と同じ結果

# * を、+ に変えた。
re_2 = /((^|[@;])[^@;]+)/

p results_2 = str.scan( re_2 )
# [["@time", "@"], [";prop1:style1", ";"], [";prop2:style2", ";"]]
0896デフォルトの名無しさん
垢版 |
2019/07/17(水) 13:38:56.68ID:FD/sfaX1
小飼って糖尿病で死んだんだっけ
0897デフォルトの名無しさん
垢版 |
2019/07/17(水) 14:01:11.32ID:fOq5lc1d
質問させてください。
PCRE や bregonig で大文字・小文字の区別なしで\x{017F}がsやSにマッチしてしまうのは仕様ですか?
0898デフォルトの名無しさん
垢版 |
2019/07/17(水) 15:07:35.98ID:Jmalh7Yl
>>887
>('>' + str + '<').replace(/>[^<]*</,'>bar<').slice(1,-1)

おぉ、perlの正規表現なら正規表現だけで大抵のことは出来るから
自分には前処理をするという発想がなかった、目からうろこでした

今回のケースもこの方法でデータの前後に ; を付ければ簡単になりましたね

>>897
\w が あ にマッチするくらいなので仕様なのでは
オプションでマッチしなくしたり出来るのでオプションのヘルプを見ましょう
0899デフォルトの名無しさん
垢版 |
2019/07/17(水) 20:30:56.60ID:2/Bgill9
>>894
ないね。
聞いたこと無いし、JavaScriptで試した限り ([@;]|^)[^@;]* でも結果は同じだった。
ただ、確かに普通に考えたら左優先でいいし、上記入れ替えで @time をキャプチャ出来るようになるべきではある。
言われてみれば優先順位が決まってないことに驚きだ。
0901デフォルトの名無しさん
垢版 |
2019/07/17(水) 20:40:11.08ID:2/Bgill9
>>895
お前は毎回Rubyの話をどのスレにも持ち込んでいる荒らしだろ。
何か言いたいことがあるのなら必ず結論を書け。
何が言いたいのか分からないのでウザイ。だから荒らしなんだよ。


+ に変えて空文字マッチをなくし、結果、希望の文字列を得る、という運用で回避するのはありだ。
ただ、その場合は、プログラマにそう分かるように、
「Rubyの正規表現エンジンは空文字マッチ周りにバグがあるので、注意してください。
空文字マッチがある正規表現を与えた場合、予期せぬ動作になることがあります。」とアナウンスしないといけない。
事実上空文字マッチが使えないが、事実なんだからそうするしかないだろ。
Rubyはこういう事を全くしないからゴミなんだよ。Rubyは滅ぶべくして滅んで行ってるだけ。
JavaScriptは少なくとも仕様に明記はしてる。
ただそれだと弱いからMDNにも書け、というのが俺の主張であり、JavaScriptスレに勝手に依頼しておいた。
以前RegExp.testの件で同様に依頼したら追記されたから、そうなるのを願っている。
そういう、「落とし穴」は共同して塞いでいかないと駄目なんだよ。

完璧な言語なんてない。だから多少バグがあるのは仕方ないとして、
それを未来永劫新規プログラマに押しつけて「キャハハー、お前も落ちたか!」なんてやっているようでは駄目なんだ。
Rubyはプログラマに対してリスペクトが全くない。だから廃れるし、俺もそうなることを願っている。
お前はRubyを吹聴しさえすれば布教出来ると勘違いしているようだが、そんなことはない。
当たり前だが新人にとってはこんなバグにつき合わされること自体大迷惑でしかないんだよ。
今回のでもPCREが一番ましだし、Rubyなんて選ばれる理由がないだろ。
ゴミだと分かっているものを広めるのは、単なる詐欺師でしかないぞ。
お前はお前の行為によってRubyへの反感を得ているだけなことを自覚した方がいい。
あちこちのスレでお前は相当ウザがられてる。

そういうのではなくて、バグを修正するとか、仕様書に明記するとか、
何でそういう建設的な方向に努力出来ないんだ?
こういう地道な積み重ねを全くやってないからRubyの現状はあるわけでさ。
0902デフォルトの名無しさん
垢版 |
2019/07/18(木) 16:11:19.79ID:Y8yxmCyC
今の複雑化した正規表現エンジンってエンジンを作った人ですらどう動くのか
予測が難しいところがあるのでは

バグと言えばバグだけど総合的に考えてみてこの動作が最適だからこのままにしよう
という部分もたくさんあると思う
だから怠慢という言葉はちょっと違う気がするなぁ

あとrubyの正規表現エンジンは空文字マッチが〜の件は
つまりonigmoのことを言ってるんだけどonigmo自体は空文字マッチに
対応してると記憶してるからrubyモードの仕様なんじゃないかな
0903デフォルトの名無しさん
垢版 |
2019/07/18(木) 20:03:10.71ID:PnG1z3PK
>>902
Ruby周りにはお前みたいなクズしかいないから駄目なんだよ。
プログラミング出来ないのなら黙ってろ。

今のお前が為すべきは、お前が持っているonigmo環境で該当パターンを試し、結果を共有することだ。
Rubyの評判を気にすることではない。

Ruby+onigmoの組み合わせでばっちり動くのなら、
「他環境はゴミです!みなさんの悩みはRubyで解決出来ます!この機会に乗り換えてください!」と言えばいいだけだ。
動くんじゃないかな、みたいなお前の希望的観測なんて何の役にも立たない。

或いは、onigmo単独では動くがRubyのバグ互換モードでは動かない、というのが事実なら、
「Rubyは次のメジャーアップデートでここが対策されます!みなさんご期待ください!」
と言えばいいだけだ。
実際、正規表現の方言/バグに参っている連中はいるんだから、それで乗り換えてくれるだろうさ。

実際、Rubyの奴らはこういう事を全くしない。
そしてRubyの評判だけを気にしているからRubyはゴミのままなんだよ。


871の件、Perl5.6だがPCREもか?と思って試したが、PCREもだ。
そしてPCREには
> using the same syntax and semantics as Perl 5.
と書いてある。つまりこれが本当ならPerl5のバグも含めて挙動は同一、ということになる。
しかしバグまで含めて同一とするにはPerlがこれを仕様化していないとほぼあり得ない。
そこでPerlを確認してみたが、どうやら以下がそれらしい。
> Repeated Patterns Matching a Zero-length Substring
> https://perldoc.perl.org/perlre.html
グダグダ説明はしてあるがPerlは読めんから詳細まで俺の読み通りかは分からんが。
いずれにしても、JavaScriptとPerlは仕様化してる。
Rubyが仕様化しておらず、これが大問題だと認識出来ないのは、Ruby界隈にはまともなプログラマがいないからだよ。
0904デフォルトの名無しさん
垢版 |
2019/07/18(木) 20:22:20.04ID:Y8yxmCyC
BREという超シンプルな正規表現エンジンが持っていた明解な動作の分かりやすさを
現代の超複雑な正規表現エンジンに求めることには無理がある

ちょっと挙動が変なところがあるけどこのほうが便利だよねってのが現代の考え方
なんじゃないかな、それに適応してるのが現代のプログラマということだろう

ゼロ幅マッチで1歩進む件もそういう挙動にするメリットがあるから
そうしてるんだろう、どんなメリットなのかは分からないが
コスト的な問題やセキュリティ的な問題かも知れない

時代遅れのプログラマが何を言おうが正直興味ないわ
現代の正規表現で見れば初心者だし
初心者が内部動作の仮説を立てたところで当たるわけがない
しかもたった数例のコードの動作を見ただけでだ、あほらしい
0905デフォルトの名無しさん
垢版 |
2019/07/18(木) 20:44:40.06ID:PnG1z3PK
>>902
お前みたいなゴミに回答する意味はないが、一応つけておいてやる。

> 今の複雑化した正規表現エンジンってエンジンを作った人ですらどう動くのか
> 予測が難しいところがあるのでは
そんなわけあるか馬鹿タレ。
今現在もスクリプタはプログラマからすると一段下に見られてて、
「スクリプタをプログラマと呼ぶな」という奴も一定数居るだろ。
その理由がこれだよ。
ガチのプログラマは数年前に他人が記述したコードでも必要あれば修正するしかない。
だからこの為に多大なる手間をかけてコードを整備してる。
スクリプタがやってる、今書いて今動いたら捨てておk、なんて甘い世界ではない。

まともなコードなら未来永劫整備可能だし、また、それを目指しているのがプログラマだ。
実際、Linuxなんて30年越しで整備され続けてるだろ。
数年前にお前が書いたコードすら読めないのは、お前の問題であって、それを全体のように言うな。
だからスクリプタは馬鹿にされるし、嫌われるんだよ。

正規表現エンジンなんてプログラミング全体からするとかなり簡単な部類だ。
動けばいいだけのエンジンなら再帰しまくりで1000行程度だろう。
最悪全交換でいい規模だから、そこまでガチで整備されている事は期待出来ないが、
それにしてもこの程度の規模のプログラムを読めない、ってことはあり得ない。
高速化はプログラムに対して「複雑度」を増すものではない。
具体的に言うと、静的コールグラフを複雑化することはなく、
単に遅い関数を速い関数に入れ替える、というのが基本になる。
だから、正規表現エンジンを読めない、というのなら、書いた奴か読む奴が馬鹿なだけであって、
ちゃんとした奴が書いたエンジンをちゃんとした奴が読めば確実に読める。
0906デフォルトの名無しさん
垢版 |
2019/07/18(木) 20:46:26.35ID:PnG1z3PK
> バグと言えばバグだけど
単なるバグだ馬鹿タレ。
> 総合的に考えてみてこの動作が最適だからこのままにしようという部分もたくさんあると思う
非互換になるのでどこでアップデートして修正するかは言語側の選択となる。
だからその前段階、つまり今どこにバグがあってどれくらい問題なのか把握し、
それを広報して共有し、どのタイミングで修正するかを話し合わないといけない。
Rubyはこれが全く出来てない。だからゴミのままなんだよ。
> だから怠慢という言葉はちょっと違う気がするなぁ
バグだと認識した上で、それを仕様として広報するのが最低の義務。
JavaScriptとPerlはそれをやっている。
Rubyの現状はバグに気づいてないか、敢えて黙っているかで、どちらにしても糞でしかない。

> つまりonigmoのことを言ってるんだけどonigmo自体は空文字マッチに
> 対応してると記憶してるから
お前がどんだけ馬鹿なのか分からないが、「バグ」ってのは意図してない動作のことを言うんだぞ。
つまり、対応してるつもりが対応できてないから「バグ」なんだよ。
> rubyモードの仕様なんじゃないかな
そう言うのはちゃんと調べてから言え。希望的観測ではミスリードを大量発生させる。
そしてこれをやりまくっているのがJavaScript界隈で、結果、JavaScripterは馬鹿が再生産されまくってる。
そういうのは止めろ。お互いに得る物がない。


>>904
まあ書いた後に読んだから投稿はしておいた。
話すつもりがないのならさようならでいい。
お前は、自身の問題を認識出来てないタイプだ。まあこのタイプもよくいるが。
0907デフォルトの名無しさん
垢版 |
2019/07/18(木) 21:56:03.46ID:xdHI+pcE
荒らしと会話するな!
荒らしと会話する者も、荒らしだぞ!

プログラマーとは、コードで語る者だけ!
能書きはいらない!

そいつらは荒らしだから、会話するな!
0908デフォルトの名無しさん
垢版 |
2019/07/18(木) 22:31:51.56ID:PnG1z3PK
>>907
お前はコードだけで語りすぎだけどな。
結論を書くようにしろよ。


というかRuby界隈の問題は典型的にこれなんだよ。
Rubyの連中と話してても話が前に進まない。

俺が老害プログラマで荒らしだったとして、
それはRubyの為にも、またこのスレを読んでいる連中の知識になるものでもないだろ。
Rubyの連中は精神年齢がちっと低すぎる。

onigumoが該当パターンに対して正しい答えを出せるのなら喧伝すればいいし、
駄目なら今現在正しく返せるPCRE以下だという現実を受け入れるしかない。
どっちでもないってのは、俺には頭おかしいとしか思えないけどな。

まあ確実に言えるのは、Rubyを今から学ぶのは止めとけ、ってことだ。
Rubyはコミュニティの腐り方がどうも他とは違う。
(JavaScriptも腐ってはいるが、あれは「若すぎる」のが原因だ。
かといって放置しても自然に改善するものでもないが)
0910デフォルトの名無しさん
垢版 |
2019/07/19(金) 00:50:19.02ID:CNkXpMDT
>>909
というかお前もそうだが、onigmo使ってるなら何で試して動作報告してくれないんだ?
そういうところがRubyのコミュニティはおかしいんだよ。
「みんなで前に進む」という感覚がない。

ちなみに
> 鬼車の中の人と Ruby の間の確執がなければとっくの昔に実装されていたのだろうかと思ったり思わなかったり。
> https://qiita.com/k-takata/items/4e45121081c83d3d5bfd
これって何?知ってたら教えてくれれば助かる。
0911デフォルトの名無しさん
垢版 |
2019/07/19(金) 02:29:00.41ID:CNkXpMDT
>>909
入る予定なんてないだろう。
> 8.2 Perl
> Perl には最短一致の繰り返し、バックトラック
> の抑制、否定先読みがある。これにより、非包含オ
> ペレータに似た効果を得ることができる。しかし、
> 7.2 節で詳しく述べたようにこれらは形式言語理論
> からすると適切に扱えず、正規表現の組合せなどに
> 問題が生じる。

> https://staff.aist.go.jp/tanaka-akira/pub/prosym49-akr-paper.pdf
つまり理論畑の人には問題があるが、プログラミング上問題はないんだろ。
そりゃ入れないだろ。
0912デフォルトの名無しさん
垢版 |
2019/07/19(金) 03:16:00.34ID:CNkXpMDT
>>910
自己レスだがだいたい分かった。
その他はリンク切れが多くて詳細までは追えないが、どうやら、勝手に使ったことに対して怒っているらしい。
https://kkos.hatenadiary.org/entries/2007/05/25#1180100250
が、ライセンス違反でなければ勝手に使え、というのがBSDだし、
告知しなかったことに関してはRuby側が悪いわけでもない気がするが。

ただこれなら鬼車にはRubyバグを作り込む必要がないから芽がある気はする。
そして文句を言ったところで鬼雲にフォークしてマージしたのなら実質大して変わらない気もする。
よく分からん所で喧嘩してるなとは思う。
0913デフォルトの名無しさん
垢版 |
2019/07/19(金) 11:33:59.54ID:bgAzEf51
このスレでコミュニティうんぬんは脱線しすぎじゃないかい。スレタイとなんも関係ないやろ。
0915デフォルトの名無しさん
垢版 |
2019/07/20(土) 17:29:27.69ID:AFOF1ubv
JSです
「はい」「はい」
「うん」「うん」
「■●」「■●」
「△◎」「△◎」
など、同じ文字列2回(あるいは2回以上)の繰り返しを探すにはどうすればよいでしょうか?

/「(.+)+」/
とかだと、1回目と2回目が違ってもヒットしちゃいますよね…?
0916915
垢版 |
2019/07/20(土) 17:31:58.05ID:AFOF1ubv
>>915
例を全部2文字にしちゃいましたが、 .+ と書いているとおり別に文字数は関係ありません
0917915
垢版 |
2019/07/20(土) 17:37:46.94ID:AFOF1ubv
>>915
そして度々すみませんが /「(.+)+」/ じゃなくて /「(.+)」+/ でした
とりあえずこれはダメな例ということで
いい例が知りたいです
0919デフォルトの名無しさん
垢版 |
2019/07/20(土) 20:12:32.11ID:AFOF1ubv
>>918
3つ目の

# 重複文字列の抽出にも応用できます
pry(main)> '東京都日野市日野市ほげほげ'.match(/(.+)(\1)/)
=> #<MatchData "日野市日野市" 1:"日野市" 2:"日野市">

ですね、ありがとうございます…!
0920デフォルトの名無しさん
垢版 |
2019/07/21(日) 20:31:55.31ID:Bdf0kkIf
>>912
ttps://kkos.hatenadiary.org/entry/20070906/1189084566
松本氏はrb_enc_mbclen()のインターフェースが不適切であるという指摘に対して、何故、その原因を私に責任転嫁したのでしょうか?

rb_enc_mbclen()のインターフェースが不適切になっている本当の理由は何でしょうか?


まつもと
元の表現は「鬼車から継承した」と書いただけで、別に「鬼車に責任がある」というつもりはありませんでした(実際「責任」はないわけですし)。


現在のインタフェースになっている原因が「鬼車がそうなっていたから」であり、その理由は「まつもとがGB18030のようなエンコーディングへの対応に対する関心が薄かった」ということです。
「だったら、最初からそう書けよ」と言われそうですが、すいません、言葉が足りませんでした。
0921デフォルトの名無しさん
垢版 |
2019/07/22(月) 01:27:11.95ID:dN38X5eV
>>920
おおサンクス。
ただ、それって 2007/05/25 より後だから、別件だね。
無駄に喧嘩してるなあ。

内容はkkos氏の方が正しい。
鬼車は最速を目指したライブラリなのだから、無駄なことは出来る限り省かなければならない。
そもそもスクリプト言語で不完全な文字列って、バイト列を直接与えるとかしないと出来ないはずだし、
その場合にはRuby側でチェックしておけ、というのはその通りで、極めて妥当な要求だ。
Rubyなんてmutable stringなのだから最初に必ずコピーが必要で、普通はその時にやればいいだけ。
その方が今時の型安全にも合うし。

それを「実は僕も問題だと思ってたんだよね」みたいな受け方をするからそりゃ不信感が募る。
これは完全にMatzが糞で、実はC流のグダグダコードを書いていて、
どこで何をするべきか分かってないのだと思う。
そしてRuby界隈ではMatzは変に神格化されてて裸の王様化してる、ってとこだろう。
878の動作結果を見ても、誰も問題だとは指摘出来ないようだし。

これはkkos氏が言っているとおりがそのままで、普通は、というか本当は、
1. Rubyは rb_enc_mbclen(p,end,enc) で記述していたが、
2. 鬼車が rb_enc_mbclen(p,enc) で記述されていることに気づき、
3. 何で end が無いのか確認して、
4. Ruby側にチェックをつける
という流れになる。
1が無いのに、「し、知ってたし」みたいなことを言うから「嘘つくな」になる。
つってもこういうちょっとズルいというか卑怯というか、絶対俺のバグは認めないマンは残念ながら普通にいるから、
いちいち問いただしても始まらない。ただ、多分、kkos氏が切れたのはその後、
> それはそれとして、鬼車を呼ぶ前に「一文字を完成していない不完全なバイト列は含まない」ことをチェックするのはかなりコストが高いのですが、
これだとは思う。鬼車側でチェックしたらコストが安い訳でもないのに、これはない。
これはコイツとは一緒にはやれない、という結論を出すには十分だ。
本来Aでやるべき事をBでやる、みたいなことをすると、コードが一気に劣化していく。
長いこと保守するつもりなら絶対に飲めない。実際、鬼車は今も保守されているし、kkos氏の判断は妥当だ。
0922デフォルトの名無しさん
垢版 |
2019/08/01(木) 15:57:12.21ID:BVNOJ7mG
>>789やってくれる人はいないか〜
2ch全盛期なら誰かしらやってくれた可能性高いけどすっかり寂れたな

onigmoに興味があるならtakata氏の日記を読破してみてはどうかな
作りながら考えてたことが分かって面白かったよ
0923デフォルトの名無しさん
垢版 |
2019/08/24(土) 12:41:17.80ID:fR0bFJ1E
perlで

(?<=(aa|bb))c

ならokだが

(?<=(aa|bbb))c

だとVariable length lookbehind not implementedになるの納得いかないなー
確かに戻り読み部分の長さに複数の可能性があるけど明らかに有限じゃん

秀丸のHmJre.dllだと通るようだ
0924デフォルトの名無しさん
垢版 |
2019/08/24(土) 13:46:10.60ID:6nD2xE5w
(?<=(aa.*|bbb))c
0926デフォルトの名無しさん
垢版 |
2019/09/01(日) 12:33:19.59ID:fodjUzDJ
JS(ES2017)です

「貫樣」みたいな、中国語でしか使われないような怪しい漢字を弾きたい
(日本語で使われる漢字のみ許可したい この場合は「貫」だけ残して「樣」は消したい)
のですが

CJKとか言って一緒くたになっている以上、Unicode範囲指定などで判別することはできないですかね…?
0927926
垢版 |
2019/09/01(日) 12:38:35.03ID:fodjUzDJ
「樣」は一応日本語でも使うみたいですね…
とりあえず常用漢字じゃなければ弾くくらいでもいいのですが
常用漢字表を作って比較するくらいしかない…のかな?
0930デフォルトの名無しさん
垢版 |
2019/09/01(日) 18:46:39.31ID:VXfAHt8z
>>927
樣は様の旧字で現在でも許容字体扱いだから「常用漢字表」にも
出て来る。
https://ja.wikipedia.org/wiki/%E5%B8%B8%E7%94%A8%E6%BC%A2%E5%AD%97%E4%B8%80%E8%A6%A7

>928-929みたいなのはあくまでコンピューター用のコードの
まとまりの話だから常用漢字か否かは区別していない。

上のリンクのウィキの本表をエクセルにコピーして2列目の
通用字体だけを残して改行を消してやり、それと平仮名や
記号を除外規定にして残り全部消すとかなら正規表現だけでも
さっさと終わるんじゃないかな。

JISの範囲内だけがほしいならシフトJISで保存したら他は
疑問符になるだろうからそれをまとめて削除したらおしまいだろうが
繁体字の樣は残る。簡体字の[木羊]は消える。
0931デフォルトの名無しさん
垢版 |
2019/09/01(日) 21:04:09.80ID:fO6VcsLE
Google謹製の正規表現ライブリ「re2」でググったら「バイオハザード2 RE:2」が検索上位に来るのどうにかならない?
0934デフォルトの名無しさん
垢版 |
2019/09/10(火) 22:48:57.92ID:CokwQGf+
直前の文字が1回以上出現することが確実なケースで、仮に0回の出現として考慮しても問題がないという場合に、
+ではなく*で正規表現を記述する理由はありますか?

例えば、慣例として*のほうを使うとか、*とするとマッチしない場合のみ+を使うとかそういう
0937デフォルトの名無しさん
垢版 |
2019/09/11(水) 12:05:55.89ID:zFEVPQj4
>1回以上出現することが確実なケース

>仮に0回の出現として考慮しても問題がない

矛盾してるな
0938デフォルトの名無しさん
垢版 |
2019/09/11(水) 15:12:05.49ID:wb8QVF41
>>934
出現が確実ではあるが、もしなかった場合にも対応したい
そういう要求があり、動作にも差し支えない場合なら * をつかう
ということに尽きるでは?
0940デフォルトの名無しさん
垢版 |
2019/09/12(木) 02:26:26.53ID:xpiKRNxb
やっぱ質問して放置か、教える側も学習すべきだな
まともな質問じゃないと思ったらスルーでいい
0942デフォルトの名無しさん
垢版 |
2019/09/12(木) 06:58:37.97ID:1ik9S0iw
いや普通におかしいだろ
なんか無理矢理の条件考えて論争させようとしてるような気がする
0943デフォルトの名無しさん
垢版 |
2019/09/12(木) 08:21:20.40ID:xpiKRNxb
自分なら人にこういう質問レスを書くかなって考えてみて絶対書かないと
思うものにはレス付けないのがいいかもね
説明不足で意味不明なものとかも
0944デフォルトの名無しさん
垢版 |
2019/09/12(木) 09:22:01.93ID:TOasMGF3
●Regular Expressionの使用環境
Mery

●検索か置換か?
置換

●説明
属性内のアルファベット小文字を削除

●対象データ
id="105I42b 104I41b"
id="99E65e 95B43d 92B87d"
id="97B22d 95D18a 93B22c 93E23b"

●希望する結果
id="105I42 104I41"
id="99E65 95B43 92B87"
id="97B22 95D18 93B22 93E23"

id="((\d+[A-Z]\d+)[a-z] ?){2,}"で検索は出来たのですが置換が思い浮かびません
0945デフォルトの名無しさん
垢版 |
2019/09/12(木) 10:00:21.41ID:bJPykHLq
わかりやすいように、できるだけそのまま書くならこうかな

●検索文字列
(id="|\G )((\d+[A-Z]\d+))[a-z]

●置換文字列
\1\2
0947デフォルトの名無しさん
垢版 |
2019/09/12(木) 10:30:50.86ID:TOasMGF3
>946
出来ました!
ありがとうございます。

田中哲スペシャルっていうやり方なのでしょうか
0948デフォルトの名無しさん
垢版 |
2019/09/12(木) 11:08:37.62ID:bJPykHLq
\Gは照合開始位置と呼ばれる物で、マッチした箇所の後の境界にマッチしてくれるので
さっきのように(特定の文字列or前回置換しところ)の後に置換したい文字列があるときとかに便利で定番

田中哲スペシャルは\gで同じ表現をもう一回使うって奴だから違うかな
0949デフォルトの名無しさん
垢版 |
2019/09/12(木) 11:58:31.87ID:TOasMGF3
>948

勉強になります。

ちなみに最初の値にはアルファベットがついてないケースだと拾えなかったのですが
id="97B22 95D18a 93B22c 93E23b"

対応策ありますでしょうか?
0951デフォルトの名無しさん
垢版 |
2019/09/12(木) 15:04:33.55ID:bJPykHLq
>>949
自分でも書けない訳じゃないみたいだし、魚を与えるより釣り方を教えよの精神でヒント
変更のない置換後でも\Gは引っかかるので、小文字がないidも全部マッチするようにすれば

こういうのを後出しされるとお互い二度手間だから
質問するときはパターンを網羅的に書いといた方が良いよ

あと>>950が指摘してくれたように誤爆が懸念されるので、\Gを\G(?<=.)にした方が良いかもしれない
●対象データが正確で、実際の対象もidのみが載ったリスト形式みたいなものなら要らないけど
0953デフォルトの名無しさん
垢版 |
2019/09/12(木) 18:08:37.95ID:EfYu2rO4
文字列 "プログラマー" を "プロクライマー" に書き換える正規表現を教えて下さい
0955デフォルトの名無しさん
垢版 |
2019/09/12(木) 22:19:07.70ID:cqw0/uFd
正規表現の使い方じゃなく作り方、バックトラックなど理論から解説している書籍やそれに準ずるサイトなど知っていたらご教示ください。
こうやればこうなるよ、こういうときはこうすればいいんだよ的な学習では身に付かなくて…
0957デフォルトの名無しさん
垢版 |
2019/09/12(木) 23:14:33.93ID:Uy9QyXie
ありがとうございます!
rubyの一件って何ですか?(何て検索したらいいですか?)
0958デフォルトの名無しさん
垢版 |
2019/09/12(木) 23:43:24.49ID:Yy9Clfy1
Rubyの作者さんと何かあったようで嫌気が差したのかそれ以後ブログで正規表現のことを
取り上げる頻度がめっきり減っちゃったんですよ
0959デフォルトの名無しさん
垢版 |
2019/09/13(金) 08:32:54.25ID:sQZEDK+j
>>958
ありがとうございます!
なるほど、残念ですね…
0961デフォルトの名無しさん
垢版 |
2019/09/13(金) 11:54:40.09ID:X5DxpBbM
正規表現はどの言語でも共通で使えますか?それともちょっと違ったりしますか?
0963デフォルトの名無しさん
垢版 |
2019/09/13(金) 13:25:46.31ID:8XwQqyT8
Ruby で作った。
一旦、パターンで一致させてから、一致した行だけを変換した。
ただし、同じ行に、id="〜" が複数あると、バグる!

src = <<'EOT'
id="aAxy Xz"

id=""
id="9"
id="9y"
EOT

# id=" で始まって、" 以外の文字が続いて、" で終わる
re = /id\=\"([^\"]+)\"/ # ( ) 内は、$1

dest = src.gsub( re ) do |line|
'id="' + $1.delete( "a-z" ) + '"'
end

print dest

出力
id="A X"

id=""
id="9"
id="9"
0964963
垢版 |
2019/09/13(金) 13:43:10.59ID:8XwQqyT8
>>963
修正

>ただし、同じ行に、id="〜" が複数あると、バグる!
大丈夫だった。正常に動く
0965デフォルトの名無しさん
垢版 |
2019/09/16(月) 02:45:59.31ID:dK4dr8mE
JSで
101 dogs
7 little goats
30 8 year old humans

↑をそれぞれ
["101", "dogs"]
["7", "little goats"]
["30", "8 year old humans"]
と切り分けるにはどんな正規表現を使えばよいでしょうか?

["7", " ", "little goats"]のような形でもかまいません

.match(/^\d+\s|.+$/)
だと
["7 ", "little goats"]
になってしまい、数字のあとの余計な半角スペースをあとで取り除かなければならなくなるのがなんか嫌で…
0966デフォルトの名無しさん
垢版 |
2019/09/16(月) 02:59:29.74ID:/xGIA7r1
正規表現を使えないなら文字列操作でやればいいだけ
正規表現を使いこなせてない人が使うとバグの温床になるからお勧めしない
0968デフォルトの名無しさん
垢版 |
2019/09/16(月) 12:07:55.69ID:oN5KVYJd
Ruby では、

chomp で、末尾の改行を削除する。
split の2 は、分割の最大数

text = <<'TEXT'
101 dogs
30 8 year old humans
TEXT

p ary = text.lines( chomp: true ).map { |line| line.split( " ", 2 ) }

出力
[["101", "dogs"], ["30", "8 year old humans"]]
0969デフォルトの名無しさん
垢版 |
2019/09/16(月) 15:25:40.41ID:YU5GpdCi
JSでは、
["30", "8 year old humans"]
ではなく
["30","8"]
となる
limitは、分割結果の制限であり、見つかった要素の数をそこまでで打ち切る
0970968
垢版 |
2019/09/16(月) 15:36:25.96ID:oN5KVYJd
>969
えー!!
0972デフォルトの名無しさん
垢版 |
2019/09/16(月) 16:04:28.98ID:2suJbq8i
matchじゃなくてsplitで

str.split(/(?<=^\d+) /)



array = str.split(" ");
array[0] + array.slice(1).join(" ")

とかじゃない?
0975デフォルトの名無しさん
垢版 |
2019/09/16(月) 16:28:11.45ID:53ZoYsUm
正規表現逆引きcgiとかないの?
雑に日本語で書き込んだらAIが判断して正規表現を返してくれる
そんなの
0976デフォルトの名無しさん
垢版 |
2019/09/16(月) 17:07:19.10ID:YU5GpdCi
>>974
マッチしない場合でもエラーにならないよう保険かけとく方がよいのでは?
(str.match(/〜/)||[]).slice(1)
0977デフォルトの名無しさん
垢版 |
2019/09/16(月) 17:20:26.44ID:oN5KVYJd
var ary = new Array( 2 )
var str = "30 8 year old humans"

var pos = str.indexOf( " " );
console.log( pos ) // 2

if( pos === -1 ) { // 見つからない
// 何かの処理
} else {
ary[ 0 ] = str.substring( 0, pos )
ary[ 1 ] = str.substring( pos + 1 )
}

console.log( ary ) // [ '30', '8 year old humans' ]
0979デフォルトの名無しさん
垢版 |
2019/09/16(月) 17:40:28.59ID:enU8we0d
>>969
知らなかった
0980デフォルトの名無しさん
垢版 |
2019/09/16(月) 18:09:34.33ID:enU8we0d
const str = '30 8 year old humans'
(([first, ...rest]) => [first, rest.join(' ')])(str.split(' '))
//=> ["30", "8 year old humans"]

あ、正規表現がねぇw
0982デフォルトの名無しさん
垢版 |
2019/09/16(月) 22:28:40.71ID:enU8we0d
次スレ立てたんだけど、
Regular Expression(正規表現) Part15
https://mevius.5ch.net/test/read.cgi/tech/1568640311/

テンプレ貼ってたら>>3 がNGワードとやらで貼れません。
というわけであとよろしく。
0983デフォルトの名無しさん
垢版 |
2019/09/17(火) 10:37:10.53ID:aFTX7+W5
>>982
>>3
のテンプレにある

【 初心者 】 正規表現 【 入門 】 ←閉鎖
http://funcchan.blog16.fc2.com/

5ch では、fc2 は、宣伝禁止かも!
これは、半角で書き込めないので、全角に変換した

このURL を削除すれば?

MANGO 板で、NG ワードを調べられる
0984977
垢版 |
2019/09/17(火) 12:02:24.99ID:aFTX7+W5
>>977
を修正した

const str = `101 dogs
30 8 year old humans`

const lines = str.split( "\n" ); // 配列

const results = lines.map( line => {
var ary = new Array( 2 )
const pos = line.indexOf( " " );

if( pos === -1 ) { // 見つからない
// 何かの処理
} else {
ary[ 0 ] = line.substring( 0, pos )
ary[ 1 ] = line.substring( pos + 1 )
}
return ary
} );

console.log( results ); // [ [ '101', 'dogs' ], [ '30', '8 year old humans' ] ]
0986983
垢版 |
2019/09/17(火) 17:07:52.35ID:aFTX7+W5
Amazon も、半角で書けないだろ

一番恐ろしいのは、はてなブログ!
書き込み禁止画面が出ずに、いきなり吸い込まれて、アクセス禁止にされる!

同様に、twitter の長いURL も、吸い込まれるものがあるらしい!

5ch で、しつこく宣伝する香具師をはめるために、いきなりのアク禁!

MANGO 板に書き込んで、何がNG ワードが、地道に判定していくしかない
0990デフォルトの名無しさん
垢版 |
2019/10/02(水) 17:34:34.60ID:dOlpIXop
U . M . E
0991デフォルトの名無しさん
垢版 |
2019/10/12(土) 20:41:17.72ID:VAjNOt6S
以下を正規表現で行うにはどうしたらよいでしょうか。
-----元データ------------------
<aaa bbb
ccc
ddd>
<eee>
ffff ggg
<hhh
iiii>
-----------------------------
-----欲しいデータ----------------
aaa bbb ccc ddd
eee
ffff ggg
hhh iiii
------------------------------
0993デフォルトの名無しさん
垢版 |
2019/10/12(土) 22:51:54.37ID:7TGqmTiW
>>991
Ruby
$ cat input.txt | ruby -e 'puts ARGF.read.gsub(/<(.*?)>/m) { |m| $1.gsub("\n", "") }'

Node
$ cat input.txt | node -e 'process.stdout.write(fs.readFileSync(0).toString().replace(/<([\s\S]*?)>/mg, ($0,$1)=>$1.replace(/\n/g, "")))'

sed
$ echo $(cat input.txt) | sed -E 's/<([^>]*)>/\n\1\n/g' | sed -e '/^ *$/d' | sed -e 's/^ *//'

sedのは一旦改行削除して、<..>の前後に改行追加して、空行削除して、行頭の空白を削除してる
0994デフォルトの名無しさん
垢版 |
2019/10/13(日) 01:09:33.88ID:Gu1oNPJo
Ruby で、

text = <<"EOT"
<aaa bbb
ccc
ddd>
<eee>
ffff ggg
<hhh
iiii>
EOT

# m option は、multi-line。$1 は、キャプチャー部分。
# [^>]+ は、> 以外の文字が、1文字以上続く
puts text.gsub( /<([^>]+)>/m ) { |matched| $1.gsub( "\n", " " ) }

>>993
>$1.gsub("\n", "")
"" は、" "(半角空白)の間違いだろ
0995デフォルトの名無しさん
垢版 |
2019/10/13(日) 01:37:59.89ID:5y3mzviq
>>994
コピペしたら元データに行末スペースが入ってたからそうしたんだけどこれは5chの仕様なのかな?
行末スペースがないなら空文字じゃなく半角スペースに置換だね
0996994
垢版 |
2019/10/13(日) 03:33:31.81ID:Gu1oNPJo
5ch からコピーすると、行末に半角空白が入るから、
漏れは、Ruby で削除してる

# クリップボード内の複数行文字列の、各行の先頭・末尾から、
# 連続する空白類を除去して、クリップボードに入れる

str = `powershell Get-Clipboard`
str.encode! Encoding::UTF_8, Encoding::CP932 # UTF_8 へ変換

ary = str.each_line.map( &:strip ) # 連続する空白類を除去する

IO.popen( 'clip', 'w:cp932' ) do | clip | # CP932 へ戻す
clip.print( ary.join "\n" )
end
0997デフォルトの名無しさん
垢版 |
2019/10/13(日) 07:48:23.30ID:0NSyRtEU
>>992-994
皆さんありがとうございました。
後方参照をさらに置換すれば良かったんですね。そんな方法があったとは!!
助かりました。
0998デフォルトの名無しさん
垢版 |
2019/10/13(日) 22:01:19.92ID:5y3mzviq
>>996
エディタのコマンドで対応できることだから
わざわざスクリプト書くのはちょっとオーバーキルかな
10011001
垢版 |
Over 1000Thread
このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 942日 20時間 38分 13秒
10021002
垢版 |
Over 1000Thread
5ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。


───────────────────
《プレミアム会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────

会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。

▼ プレミアム会員登録はこちら ▼
https://premium.5ch.net/

▼ 浪人ログインはこちら ▼
https://login.5ch.net/login.php
レス数が1000を超えています。これ以上書き込みはできません。

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