18/02/16 20:46:56.42 d9VDf+sb.net
>>421
$# 「行頭部分にある 1 個以上の \[[^\]
454:*\] を削除」と初見で思ったのだが、違うのか? $# それとも C# でどうやるかわからないという話? 申し訳ないが C# は知らない。 $ $cat a_in [ああ]おおおおお [いいい]こここここ [うう][ええ]そそそそそ ととととと[たた] [ええ]あああ[いい]うう $perl -pe 's/^(\[[^\]]*\])+//' < a_in おおおおお こここここ そそそそそ ととととと[たた] あああ[いい]うう $perl -0777 -pe 's/^(\[[^\]]*\])+//gm' < a_in おおおおお こここここ そそそそそ ととととと[たた] あああ[いい]うう $
455:デフォルトの名無しさん
18/02/16 21:24:08.90 nYHQACKk.net
>>438
Non-greedy(最短)なマッチ使えばいいだけじゃね?
使えない環境なの?
456:デフォルトの名無しさん
18/02/17 05:30:35.08 xZfN9pA3.net
何を望んでいるのかを明確にする方が先かと……
457:デフォルトの名無しさん
18/02/17 11:13:15.50 sN1lrGX4.net
>>443
none-greedyじゃ先頭しかマッチしない
[abc][def]ghi
の[abc]しか除去出来ない
反復適用すればいいというならその通りではあるが
458:デフォルトの名無しさん
18/02/17 11:27:08.57 IU1gsQgu.net
[ab][cd][ef]ああ
これは、繰り返しが入っている。
N回削除する必要がある
[ab][cd][ef]ああ
[cd][ef]ああ
[ef]ああ
ああ
[~] でグループ化すべき
459:デフォルトの名無しさん
18/02/17 12:22:01.47 IU1gsQgu.net
/^\[[^\]]*\]/ =~ "[ab][cd]ああ"
$& #=> [ab]
Ruby で書いた。
行頭が\[ で、\[ 以外の文字が、0以上続いて、\] がある
460:デフォルトの名無しさん
18/02/17 12:32:03.69 IU1gsQgu.net
/^\[[^\]]*\]/ =~ "[ab][cd]ああ"
$& #=> [ab]
$' #=> [cd]ああ
/^\[[^\]]*\]/ =~ $'
$& #=> [cd]
$' #=> ああ
/^\[[^\]]*\]/ =~ $'
#=> nil
Ruby で書いた。
行頭が\[ で、\[ 以外の文字が、0以上続いて、\] がある
$& はマッチした部分で、$' はマッチした部分の後ろを表すから、
マッチを繰り返していけば、出来るけど
461:デフォルトの名無しさん
18/02/17 12:42:57.33 IU1gsQgu.net
/^(\[[^\]]*\])+/ =~ "[ab][cd]ああ[ef]"
$& #=> [ab][cd]
やったー。Ruby で出来た
\[ があり、\[ 以外の文字が、0以上続いて、\] がある。
これをグループ化して、1回以上繰り返す
ただし、グループ外に、先頭からを指定する
462:デフォルトの名無しさん
18/02/18 07:04:41.40 4dAbe4pu.net
正規表現で使用される記号があるとワケわからなくなってくるから
適当な記号、例えばQなどに置き換えて試行錯誤して最後に元の記号に戻したりする
463:デフォルトの名無しさん
18/02/18 11:53:19.92 QWcmX5lk.net
余計なバックトラックを防ぐために
$s = qr/(?>\s*)/
ってやってパターンに埋め込むことならある。
464:デフォルトの名無しさん
18/02/23 22:29:48.73 vtIXFjR6.net
(?s:^(?=.*ス)(?=.*プ))
CHmateで使う正規表現らしいんだけど最初の
(?s:"
の意味が検索してもわからないのですが教えていただけないでしょうか
465:デフォルトの名無しさん
18/02/23 22:45:42.10 0zsudQHR.net
>>452
シングルラインモード
>>349
466:デフォルトの名無しさん
18/02/24 00:35:55.07 bvxyjlLF.net
>>453
ありがとございます
確認してなんとなく分かりました
ところでこの正規表現の場合(?s:)って名前には改行はないので不要じゃないかと思ってしまうのですがどういう目的で使われているのでしょうか
467:デフォルトの名無しさん
18/02/24 01:37:05.64 d6NztqhC.net
書いたヤツの趣味じゃ?
しかもかなりてきとう
ワッチョイ名前ならおそらくドコモ判別?でもプだけではないスレリンク(mango板:312番)
先読みなんてコストかけなくてもKOROKORO AAはSd固定
改行を無理矢理入れ込んでというシチュエーションでスとプでねらい打ちも違和感
本文で^(?=.*A)の類を使うとレス数後半のコストはかなりのもの
これは名前だから大したことにはならないけど
深謀遠慮があるのかも知れんがそれこそ書いた本人へ
468:デフォルトの名無しさん
18/02/27 15:54:44.12 2v1tH105.net
C#で、
var rgx = new Regex("(.)+");
var str = "こんにちは。";
Console.WriteLine(rgx.Replace(str, "$1"));
とすると「。」が出力されるのですが、なぜですか?
$1は「。」になるのですか?「こ」だと思ったのですが、違いますか?
469:デフォルトの名無しさん
18/02/27 16:08:59.77 u9k8VAiO.net
>>456
理由はここ読んで
URLリンク(www.regular-expressions.info)
短い説明は↓ここでも出てくる
URLリンク(regex101.com)
470:デフォルトの名無しさん
18/02/27 17:03:18.46 VEiALCIH.net
どれどれ…
javascript
'こんにちは。'.replace(/(.)+/, '$1');
=> "。"
ほんまや!知らんかった
471:デフォルトの名無しさん
18/02/27 19:34:07.35 LuvO3mbW.net
>>457
配列に入れてくれればいいのに
って思ったことあるわ
472:デフォルトの名無しさん
18/02/27 21:09:42.50 PLAOSS1/.net
Ruby でも、
'こんにちは。'.gsub(/(.)+/, $1)
#=> "。"
473:デフォルトの名無しさん
18/02/27 22:02:02.32 u9k8VAiO.net
>>459
.NETはCaptureCollectionってのに入れてくれるみたいよ
ただフルマッチとキャプチャリンググループと両方1度に必要なければ
/(.){1}/みたいに正規表現変えれば配列に入れられるよね
474:デフォルトの名無しさん
18/02/28 21:03:30.09 V9ixSdqS.net
>>457
すみません。
教えて頂いたサイトを見ても分かりません。
簡単に解説をお願いしたいのですが。
475:デフォルトの名無しさん
18/02/28 22:05:09.20 pxJOkH76.net
単純に最後にマッチした部分ってことじゃないかな。赤ラクダにそう書いてある。
C# は知らない。誰か翻訳してあげて。
476:デフォルトの名無しさん
18/03/01 00:07:23.55 UkKloD3U.net
>>462
キャプチャグループに量指定子がついてるとそのキャプチャグループの箇所に複数回マッチする可能性があるよね。
んで複数回マッチした場合は最後にマッチしたやつがそのキャプチャグループに入ってるってこと
"こんにちは。”に対して、/(.)+/でマッチをかけると
最初にピリオドが“こ”にマッチしてそれをグループ1に入れて
次に+を見てまたマッチするか繰り返す
今度はピリオドに”ん”がマッチするからそれをグループ1に入れて、、、
あとは繰り返し
“こんにちは。”が/(.)+/にフルマッチした時点でグループ1に入ってるのは”。”
477:デフォルトの名無しさん
18/03/01 00:17:03.42 ikcjc59H.net
/(.+)/ =~ 'こんにちは。'
$1 は、'こんにちは。'
/(.)+/ =~ 'こんにちは。'
$1 は、'。'
上は、1回しかマッチしていない、最長マッチ。
下は、1文字のマッチで、6回マッチして、最後のマッチが、'。'
478:デフォルトの名無しさん
18/03/01 00:55:21.78 UkKloD3U.net
>>465
うーん、1文字マッチで6回マッチするのはどっちも同じじゃない?
キャプチャグループに入れる回数の違い
479:デフォルトの名無しさん
18/03/01 02:58:48.22 ksBcbegD.net
>>464
なるほど。
480:デフォルトの名無しさん
18/03/01 05:29:23.47 AobHbkwq.net
詳細 ○○表現
尼での評価がよかったので買ってみたが全然
リファレンスにもならない
やっぱり海外の訳本はだめだ、すくなくとも自分には良書でなかった
481:デフォルトの名無しさん
18/03/01 15:52:15.50 UkKloD3U.net
フクロウ本のことかな
中の仕組みを理解するための本であって
リファレンス本でも入門書でもないからね
482:デフォルトの名無しさん
18/03/02 09:24:29.36 O5NS5hyG.net
>>466
そういうマッチャー自分で作る時はスキップするよう作るけど
正規表現エンジンはしないのか
複雑だとやってられないとかか
483:デフォルトの名無しさん
18/03/02 13:01:46.53 btKfsNEv.net
試しに
for pat in '([cd])+' '(.)+' '.*(.)' ; do perl -Mre=debug -e '$pat = shift; print "abcd" =~ /$pat/ ,"\n" ;
484:' "$pat" ; done ってやってみた。最適化してそうだ。.*(.) は意味的には同じだと思うがバックトラックの分だけ不利。 Perl のソースコードを確認したわけではないので断定はしかねるが。
485:デフォルトの名無しさん
18/03/03 08:34:43.98 ooAwkD9v.net
今はサンプルだからいいけど
長大な文章じゃスキップで最適化しないとやってられないよな
486:469
18/03/03 13:47:58.16 GJwmn3yF.net
個人的には (.)+ と書くべき理由が思い当たらない。
487:デフォルトの名無しさん
18/03/04 15:44:40.85 QUMop1Gl.net
正規表現とギターの速弾きが出来る奴は賢いと尊敬している
488:デフォルトの名無しさん
18/04/06 19:38:34.22 U5C29TI1.net
複数のSQL文の書かれているSQLファイルから、DBの処理単位でSQL文を逐次取り出す正規表現が書きたいのですがどうしたら良いですか?
厳密なものでは無くても良くて英文字から始まってセミコロンで終わるというもので良いのです。
ただ、SQL分は行頭から始まるとは限らず、セミコロンの直後に次のSQL文が始まったり、空白文字などがあってからSQLの文が始まったりすることもあります。
また、文中に出てくるエスケープされたセミコロンや文字列中のセミコロンは文末の対象になって区切られては困るのでそれはスキップして評価がしたいです。
489:デフォルトの名無しさん
18/04/06 22:09:42.71 witjIkkr.net
文字列の内外を判断するの難しい・・・・難しくない?
490:デフォルトの名無しさん
18/04/07 12:21:20.06 BRhgC8GS.net
multilineのオプション付けて
;でsplitしただけじゃだめなん
491:デフォルトの名無しさん
18/04/07 12:23:00.56 BRhgC8GS.net
>>476
それが含まれる時点で無理に正規表現一行で書くのはいつもあきらめる
492:デフォルトの名無しさん
18/04/07 12:30:00.76 LBmouzwW.net
ちゃんとやるなら文字列中のエスケープされたシングルクォートとかも処理しないとダメだし正規表現でやるのはすごく大変だと思う
493:デフォルトの名無しさん
18/04/07 12:57:57.77 wQfk+GMe.net
正規文法ではかなり厳しい印象で, BNFの管轄だと思うおよね
494:デフォルトの名無しさん
18/04/08 06:27:09.85 1mmlbc0v.net
1. ; で分割して、配列に入れる
2. 配列の各要素から、余分なものを削除する
2 のルールを、厳格に決めればよい
Ruby で作る方が速い
495:デフォルトの名無しさん
18/04/08 11:04:16.11 YK+KPtHu.net
正規表現は置いといて
DB用意して""で囲まれた部分をテキストとしてDBに入れながらID取得
本文側はIDに置き換える
あとは正規表現を使っても使わなくてもいいが;で分割
最後にまたID部分に元のテキストを流し込む
496:デフォルトの名無しさん
18/04/08 13:00:20.92 .net
そこであきらめんなよ!
正規表現だけで乗り切ろうという気概を見せろよ!
497:デフォルトの名無しさん
18/04/08 13:08:05.41 wO4VFvVz.net
(シングル|ダブル)クオート文字列って正規言語で表せる範囲にあるんかね?
文脈自由言語では表せるけど
498:デフォルトの名無しさん
18/04/08 13:27:19.00 aPw27k7Z.net
どの正規表現がつかえるのかがわからん
環境を明示してくれないとなー
499:デフォルトの名無しさん
18/04/08 18:18:43.83 1mmlbc0v.net
/\"([^\"]*)\"/ =~ 'a"bc"d'
$1 #=> bc
"~" で、~には、" 以外の文字列が入る
500:デフォルトの名無しさん
18/04/08 18:28:48.48 aPw27k7Z.net
"のエスケープや'もあるし
'a"b\"c'd"e'
501:473
18/04/09 10:33:55.69 Q+cYQrXX.net
沢山ご回答ありがとうございます。
皆さんのご意見を伺った限り、やはり正規表現一本では難しそうですよね…
はじめは前処理で既成のsqlパーサなどを通して、きれいに整形して別ファイルに保存してから処理する方法も検討していましたが、
できれば現物ファイルを生のまま読み込んで正規表現でなんとか行けないかなと思い試行錯誤していて、
うまい書き方が全然できなくてここに書き込みさせて頂いた次第です。
>>485
使用できる正規表現はPCREです。
具体的にはPHPで省メモリで巨大なSQLファイルを実行する仕組みが作りたくて
相談させてもらいました。自分の頭の中のアイデアでは
1.fileをbufsize分readして
2.正規表現でマッチするかチェック
3.マッチしていたらそのSQLを実行。マッチした文より、先の部分は次の実行のためにバッファに積んで1へもどる
4.マッチしていない場合は更にbufsize分read、2->4を繰り返す。
こんなイメージでした。
それを鑑みると、>>482さんのアイデアはちょっとありかなとも思います。
スレ違いなっちゃいますが、regexを使わずプログラム上でクオートの始まりと終わりを正しく
処理できれば随分楽できそうな気がします。一考の余地ありですかね?
502:デフォルトの名無しさん
18/04/09 12:10:15.13 M/BmQ9Z1.net
"'", "\""
'"', '\''
クォーテーション内にクォーテーションがある、入れ子状態が難しい。
クォーテーションを、\ でエスケープしたりもあるし
XML Parser とか、プログラム実行の命令木とか、解析ツールを使わないと無理。
プログラミングで何とかできる、範囲を超えている
そもそも、入れ子状態にどういうパターンがあるのか、
全列挙して考えるのが、非常に難しい
入れ子の入れ子とか、再帰的に入れ子するかも知れないし
503:デフォルトの名無しさん
18/04/09 17:17:14.98 4vJW9Ikj.net
>>488
こういう感じでどうだろう
[a-zA-Z](?:\\"|\\'|[^"';]|(["'])(?:\\\1|(?:(?!\1).))*(?<!\\)\1)*;
英数字で始まって、\"や\'は許す;で終わる文字列
頭に^\s*を付けたほうがいいかもしれないけど
文字列は、" ' "、' " '、" \" "、' \' 'は許す( ; もOK)
ところで、" ' " ' "とは書けるんだっけ?
こういう括弧のネストが可能なら、正規表現の方もネスト構文や条件構文を使わないといけないけど
(俺は使ったことはないけど)
504:デフォルトの名無しさん
18/04/09 17:44:25.66 4vJW9Ikj.net
ただし↑は、コメント文はないものとしてのこと
505:デフォルトの名無しさん
18/04/09 19:00:46.18 4vJW9Ikj.net
さっそくダメだった
"\\"
506:デフォルトの名無しさん
18/04/10 00:21:39.82 oEQHPFsL.net
仕様を確定させるのが難しい。
単なるテキストには、ルールが無いだろ
XML とか、プログラム言語には、仕様があって、
ルール違反の書き方を許さないから、プログラムで判定できる
だから、まずこう書いたらエラーにする、という仕様を決めるべき
507:デフォルトの名無しさん
18/04/10 01:17:02.18 IM3kTV8x.net
>>493
URLリンク(ronsavage.github.io)
こいつのcharacter string literalとか読め
ちゃんと規格化されてるんだからさ
その上で正規表現で書くのは難しいって話
508:デフォルトの名無しさん
18/04/11 13:14:45.93 p/bo/Ju1.net
試しに 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 を使ったりする。
509:デフォルトの名無しさん
18/04/11 14:19:31.82 jfPKheqL.net
仕様通りのParser とか、構文解析ツールが必要
それらを使って出力された、抽象構文木を使うのがよい
510:デフォルトの名無しさん
18/05/04 19:16:13.25 kVAlpXQV.net
★タイトル
★★タイトル
上のものにマッチさせたいのですが、
^★.*$
としてしまうと、下まで含まれるのですが、どうしたらいいでしょうか
511:デフォルトの名無しさん
18/05/04 19:36:12.61 eD01Afe2.net
>>497
^★(?! ★).*$
512:495
18/05/04 21:14:35.89 L0LZvRGB.net
半角SP紛れ込んだわ
^★(?!★).*$
513:デフォルトの名無しさん
18/05/05 05:47:27.14 iaqxNbgL.net
↑解答どうも
できなかったです
ちなみにmeryというテキストエディタの正規表現です
何の言語かはわかりませんが
514:デフォルトの名無しさん
18/05/05 06:26:09.87 O3up5M1Q.net
URLリンク(regex101.com)
鬼雲みたいだし動くと思うんだけど, 先頭とか末尾に余計なスペース入ってない?
515:デフォルトの名無しさん
18/05/05 19:07:12.77 iaqxNbgL.net
↑ありがとうございます。行けました。
.*の前に否定を入れればいいんですね
516:デフォルトの名無しさん
18/05/05 21:57:45.66 +tF+3NSL.net
鬼雲…だと…?!
517:デフォルトの名無しさん
18/05/07 13:28:13.91 XtvW294Z.net
正規表現をちゃんと論理的に導きたいと思って参考になる本を
買ったら必要な予備知識に群とか環が出てきて即諦めた
正規表現周りの開発をしてる人達はすごい人達なんだなぁ
すごさを直で実感出来た
518:デフォルトの名無しさん
18/05/07 14:59:22.19 QMgv+0U5.net
用語に慣れてないだけだろ
やってることは大したことじゃない
519:デフォルトの名無しさん
18/05/07 18:08:31.65 XtvW294Z.net
まぁ膨大な時間と労力をかければ自分にも分かるんだろうけど
現実的じゃないんだよなぁ(人の何倍も時間かかるだろうし)
これからは正規表現技術者の努力に感謝しながら正規表現を
使おうと思います(^^)>
520:デフォルトの名無しさん
18/05/14 07:31:45.21 0PI4I4+g.net
JavaScriptによる正規表現チェッカー
くっそ長いので短縮
URLリンク(goo.)<)
o54++44Oe44OD44OB44OG44K544OIICovXG5cbi8vIOato+imj+ihqOePvlxudmFyIHJlID0gbmV3
521:IFJlZ0V4cCgv XFxkKy9nKTtcblxuLy8g44OG44Kt44K544OIXG52YXIgdGV4dCA9IChmdW5jdGlvbiAoKSB7LypcbmFhYVxuYmIx MmJcbmM1NjdjYzg5XG4qL30pLnRvU3RyaW5nKCkuc3BsaXQoL1xcbi8pLnNsaWNlKDEsLTEpO1xuXG5jb25zb2x lLmxvZyhcIlJlZ0V4cDpcIiwgcmUudG9TdHJpbmcoKSlcbmNvbnNvbGUubG9nKFwiVGV4dDpcIiwgdGV4dCk7XG5c bnRleHQuZm9yRWFjaChmdW5jdGlvbihsaW5lKSB7XG4gICAgY29uc29sZS5sb2coXCJsaW5lOlwiLCBsaW5lKTtcbiA gICB2YXIgcmVzdWx0ID0gbGluZS5tYXRjaChyZSk7XG4gICAgaWYocmVzdWx0KVxuICAgICAgICBjb25zb2xlLmxv ZyhcInJlc3VsdDpcIiwgcmVzdWx0KTtcbiAgICBlbHNlXG4gICAgICAgIGNvbnNvbGUubG9nKFwicmVzdWx0OlwiLCBcIm51bGxcIik7XG59KVxuIn0
522:デフォルトの名無しさん
18/05/15 21:31:31.85 xchMEgzc.net
ちょっと修正
URLリンク(goo.) gl/M2Fn68
523:デフォルトの名無しさん
18/05/19 02:57:37.83 F73VBvr9.net
Linuxに触れるまで正規表現に方言があるなんて知らなかった
基本正規表現だの拡張正規表現だの
vimの置換で悩んでたら原因がエスケープの有無が原因とかもうね
ある程度は使えるが先読みとか後読みとか僅かでも深入りすると余計に混乱する
524:デフォルトの名無しさん
18/05/19 11:08:45.44 rxs2hai/.net
小さい世界で囲い込まれてれば楽だよな
ただし何かの拍子ではみ出した時に世界の広さを知って己の無力さを痛感する
よくあるパターン
525:デフォルトの名無しさん
18/05/23 19:28:29.89 Au5e7VGg.net
僕の知り合いの知り合いができたパソコン一台でお金持ちになれるやり方
役に立つかもしれません
グーグルで検索するといいかも『ネットで稼ぐ方法 モニアレフヌノ』
QBPEH
526:デフォルトの名無しさん
18/05/24 10:47:44.54 cPlRxlDn.net
QBPEH
527:デフォルトの名無しさん
18/05/25 13:52:01.06 X/Hngdv+.net
HTMLの解析を正規表現でやりたいのですが
<a href="xxxxx"><img src="yyyyy" /></a>
という風に、<a> で括られた img の src だけを抽出したいんですけど
どうしたらいいのでしょう。
<a> で括られてない
<img src="yyyyy" />
は除外したいのです。
528:デフォルトの名無しさん
18/05/25 13:53:08.12 X/Hngdv+.net
あ、すみません
<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> 以外のゴミも入ってきます。
※ゴミは無視したい
529:デフォルトの名無しさん
18/05/25 14:10:36.40 dgrSTrid.net
>>514
^<a\b.+<img src="([^"]+)".+</a>$
↓
$1
530:デフォルトの名無しさん
18/05/25 16:20:05.07 fgSfMucA.net
>>515
<a href=""></a><img src="1.jpg"><a href=""></a>
531:デフォルトの名無しさん
18/05/25 20:00:28.32 OUvr9ihJ.net
頑張ってみてもこの程度が限界
URLリンク(regex101.com)
で, >>513がHTMLの解析を正規表現だけでやる理由は何だ?
Pythonのhtml.parser, RubyのNokogiri, PHPならGoutter, それ以外の言語でも間違いなくHTMLパーサは誰かしら作ってる
そんな中で何故正規表現だけで?ぶっちゃけこういう用途には向いてない, というかHTMLの構文規則は正規言語を超えるんだけど, 分かってる?
532:デフォルトの名無しさん
18/05/25 20:29:09.95 rhJz1xPv.net
パーサかましてXPathで
533:必要な情報だけ抜くのが基本だしな どうしても使えないっていう理由があるなら仕方ないけど
534:デフォルトの名無しさん
18/05/25 21:21:37.93 lQiYp+1p.net
鬼雲限定
<a (?~</a>)<img src="([^"]+)"[^>]*>(?~<a )</a>
535:デフォルトの名無しさん
18/05/25 22:28:52.14 Cqv+6nk2.net
■変更前
004a34
A521n2
785b66
■変更後
0049934
99521992
7859966
----------------------
数値以外を99に置換したいです
お願いします
536:デフォルトの名無しさん
18/05/25 23:31:17.71 gd/oxjVv.net
木構造のものは、正規表現じゃ無理
1< 2< abc 3> 4>
2<からの最短マッチで、対応する3>を取れるけど、
1<からの最短マッチで、対応する4>を取れない。
3>にマッチしてしまうから
1< 2< 3< abc 4> 5> 6>
これでも、2<と5>をマッチさせられない。
最長・最短マッチでも、マッチしない
CSS セレクターを使う、jQuery, RubyのNokogiri などを使え。
これらの使い方は、ほぼ同じ
537:デフォルトの名無しさん
18/05/25 23:43:29.83 OUvr9ihJ.net
>>520
数値以外と簡単に言うが改行文字や空白等の扱いはどうするんだ
変換対象文字をちゃんと明示しないと
/[^0-9]/99/g
こんなもんが欲しいわけではあるまい
とりあえずASCII印字可能文字に限るなら
/[\x21-\x2F\x40-\x7E]/99/g
だが当然マルチバイト文字は対象外
538:デフォルトの名無しさん
18/05/25 23:44:35.69 OUvr9ihJ.net
\x40じゃなくて\x3Aだわ
539:デフォルトの名無しさん
18/05/26 10:42:28.41 oqQZJpqn.net
>>519
非包含オペレータか
540:デフォルトの名無しさん
18/05/26 17:59:00.22 xbMfHZm2.net
>>521
再帰を使えば、対応する括弧のネスト対応ぐらいならできるらしいよ(鬼雲、PCRE)
<([^<>]++|(?R))*>
# [^<>]++は(?>[^<>]+)としてもよい(どっちもバックトラックしないと思う)
# (?R)は、(?0)とも書ける
# (<([^<>]++|(?1))*>)
\g<-n>を使ってもできる(鬼雲だけ?)
(<(?:\g<-1>|[^<>])*>)
# \g<-1>は(?-1)とも書ける
# ここでは\g<-1>を先に書いたが上と同じく後ろに書いても同じ
541:デフォルトの名無しさん
18/05/26 19:07:35.21 vUfk79H6.net
URLリンク(regex101.com)
なぁこれメンテしたいか?というか出来るか?なぁ?
(?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>)
542:デフォルトの名無しさん
18/05/26 19:08:54.60 vUfk79H6.net
アップデートするの忘れてたわ
URLリンク(regex101.com)
543:デフォルトの名無しさん
18/06/23 01:47:09.94 19kQ7FFf.net
のりこめー
【IT】プログラマーが正規表現を使いこなすメリットとは?
スレリンク(bizplus板)
544:デフォルトの名無しさん
18/06/24 13:33:59.68 wSHpLaLO.net
文字列の中から数字13桁(それ未満でも超えてもNG)を抽出するにはどうしたらいいでしょう
JANコードらしきを抜き取りたいのです。
候補を抽出してから後でチェックデジット計算しますので
数字13桁のみで大丈夫です。
545:デフォルトの名無しさん
18/06/24 15:06:08.45 F1zD07yq.net
数字40桁くらい連続してたらどうする?
546:デフォルトの名無しさん
18/06/24 16:56:18.47 wSHpLaLO.net
40桁はJANコードじゃないので除外したいです
547:デフォルトの名無しさん
18/06/24 17:16:44.02 1DBcJ9cD.net
\b[0-9]{13}\b
とか
(?<![0-9])[0-9]{13}(?![0-9])
とか
携帯だから試してない
548:530
18/06/24 20:41:43.34 LPLL+qJx.net
先頭と末尾も考慮すると
URLリンク(regex101.com)
549: (?:(?<=[^0-9])|^)[0-9]{13}(?:(?=[^0-9])|$) ただかなりバックトラックするから性能は悪い どうせチェックディジット確認するなら13桁以上で全抽出して桁数チェック追加した方がマシに見える https://regex101.com/r/xT760t/4 [0-9]{13,}
550:デフォルトの名無しさん
18/06/24 23:39:40.09 chBT6m1a.net
結構、難しい
A <13桁の数字> B
A の部分が、文字列の先頭か、数字以外で、
B の部分が、文字列の末尾か、数字以外
551:デフォルトの名無しさん
18/06/25 07:16:09.30 HTnjHonA.net
文字列操作可能なら両端に数字以外の文字を付加して
[^0-9][0-9]{13}[^0-9]
かな
552:デフォルトの名無しさん
18/06/25 08:32:20.35 g3low2hV.net
>>533
先読み後読みは先頭や末尾にも一致するからそういうのは無駄
>>532の二つ目で完成している
553:デフォルトの名無しさん
18/06/25 09:21:19.58 9/L2g6Oc.net
>>536
せやな, 否定前後読みならそのままでよかったわ(肯定で試しちゃった)
ただどのみちバックトラック多くて無駄だから正規表現だけでやるのでなければ13桁以上でマッチングして桁数判定入れるべきだと思う
554:デフォルトの名無しさん
18/06/25 21:12:44.36 lRi8bnr9.net
13桁を超えていても候補として受け取っておいて
チェックデジットの計算の手前で落とします。
どうもありがとうございました。
555:デフォルトの名無しさん
18/06/26 18:51:05.99 PFtq6YS9.net
文字列の先頭の文字以外を*に変換する
というのはどう書けばいいでしょうか?
556:デフォルトの名無しさん
18/06/26 20:16:27.74 IMFKH44M.net
こういうこと?
$perl -pe 's/(?!^)./*/g'
alpha
a****
beta
b***
gamma
g****
$
良い方法かどうかはわからないが。
557:デフォルトの名無しさん
18/06/26 20:22:51.32 IMFKH44M.net
perl -pe 's/(?<!^)./*/g'
とすべきだったかな。
558:デフォルトの名無しさん
18/07/04 22:06:49.23 gFgZc5FG.net
J1Q
559:デフォルトの名無しさん
18/07/05 16:31:37.58 AeL6VB/V.net
J1Q
560:デフォルトの名無しさん
18/07/16 14:08:24.67 80hpbb9v.net
1 2 3 の3つの文字を、順番不同で、必ず各々、1つ以上含む
a23b1 → 真
1a2 → 偽
これは順番の組み合わせだから、正規表現で出来ますか?
561:デフォルトの名無しさん
18/07/16 14:41:45.67 /+vnEc6c.net
>>544
先読みが使えれば
^(?=.*1)(?=.*2)(?=.*3)
562:デフォルトの名無しさん
18/07/25 19:56:10.60 1XdhMp/e.net
サクラエディタで
<>で囲まれていない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が沢山あるので変換しきれません
何とかならないでしょうか
563:デフォルトの名無しさん
18/07/25 20:31:56.63 AmPlbSPQ.net
[]内のa取っ払って
ぜんぶ変換できるまで何回もやったら?
(>[^<]*?)aaa([^>]*?<)
564:デフォルトの名無しさん
18/07/25 20:46:43.74 AmPlbSPQ.net
aaa(?=[^>]*<)
前後に必ずタグがあるならこれなら一回
565:デフォルトの名無しさん
18/07/26 09:15:37.25 4NbdqkDU.net
>>547>>548
できた!できました!
ありがとうございます
566:デフォルトの名無しさん
18/07/29 09:53:04.64 JxpitKP8.net
●
パターン1, (\d+)月(\d+)日
パターン2, (\d+)月(\d+)数字以外(\d+)日
これを一回で取得したい
●対象データ
7月1日
7月2~4日
7月6から10日
7月12・13日
●希望する結果
7,1
7,2,4
567: 7,6,10 7,12,13 お願いします
568:デフォルトの名無しさん
18/07/29 10:18:20.53 kCYuy8BN.net
取得って何だよ変数に入ればいいのか置換結果として取得したいのか
569:デフォルトの名無しさん
18/07/29 10:49:28.56 TzC7zb5n.net
>>550
ほんまにそれが希望する結果?
数字とりだしてるだけなんだけど。
570:デフォルトの名無しさん
18/07/29 10:59:44.43 JxpitKP8.net
取り出すだけでいいです。
571:デフォルトの名無しさん
18/07/29 11:42:16.30 kCYuy8BN.net
数字取り出して変数に入れるだけなら /(\d+)月(\d+)(?:\D+(\d+))?日/gu で仕舞いだが
572:デフォルトの名無しさん
18/07/29 11:45:23.47 JxpitKP8.net
>>554
完璧です。
ありがとうございました。
573:デフォルトの名無しさん
18/07/29 11:49:24.17 kCYuy8BN.net
変数にキャプチャしたいのか置換で取り出したいのかくらい書こうな
574:デフォルトの名無しさん
18/07/29 11:57:08.75 JxpitKP8.net
失礼しました
575:デフォルトの名無しさん
18/08/12 20:55:52.79 MOc1ccj1.net
C#で正規表現を使ってHTML内から文字コードをとってきたいのですが
以下の場合だと"UTF"としか取得できません。
"UTF-8"と取得する場合どうすればいいでしょうか?
<[^>]*\bcharset\s*=\s*[""']?(?<charset>\w+)\b
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
576:デフォルトの名無しさん
18/08/12 21:30:40.27 mMH07JtW.net
>>558
HTMLは扱いが難しいからパーサ使った方がいい
どうしても正規表現だというなら,
1. とりあえず的な修正
URLリンク(regex101.com)
/<[^>]*\bcharset\s*=\s*(?:([^\s"'=><`]+)|'([^']*)'|"([^"]*)")\b/$1$2$3/i
2. もう少し気合の入れた修正
URLリンク(regex101.com)
|<meta
(?:\s+[^\s"'>/=]+(?:\s*=\s*(?:[^\s"'=><`]+|'[^']*'|"[^"]*"))?)*
(?:\s+charset(?:\s*=\s*(?:([^\s"'=><`]+)|'([^']*)'|"([^"]*)"))?)
(?:\s+[^\s"'>/=]+(?:\s*=\s*(?:[^\s"'=><`]+|'[^']*'|"[^"]*"))?)*\s*/?>|$1$2$3|i
ぐらいか
でもこれ後で読むのしんどいでしょ
577:デフォルトの名無しさん
18/08/12 21:47:08.19 L571MbNB.net
>>559
神だ
578:557
18/08/12 21:53:09.85 mMH07JtW.net
2.の方を若干修正, charsetには値が必要ですわ
URLリンク(regex101.com)
|<meta
(?:\s+[^\s"'>/=]+(?:\s*=\s*(?:[^\s"'=><`]+|'[^']*'|"[^"]*"))?)*
(?:\s+charset\s*=\s*(?:([^\s"'=><`]+)|'([^']*)'|"([^"]*)"))
(?:\s+[^\s"'>/=]+(?:\s*=\s*(?:[^\s"'=><`]+|'[^']*'|"[^"]*"))?)*\s*/?>|$1$2$3|i
579:デフォルトの名無しさん
18/08/12 22:00:37.17 MOc1ccj1.net
>>559
ありがとうございます!
当方がやりたかったことは、HTMLをテキストデータとして大量に取得して、その中から特定のワードでの絞り込みです。
正しい文字コードでHTMLを落としてからパースしようと思ったのですが、確かにパーサでやる手もありそうですね
正規表現は今まで避けてきたので、読むのがシンドイっていうかチンプンカンプンですが
求めていた動作です。とても助かりました。
使わせてももらいます。ありがとうございました。
580:デフォルトの名無しさん
18/08/12 23:56:24.69 2UQfVx23.net
HTML のように、要素に親子関係があるもの・構造化されたものは、正規表現じゃ無理
<1><x></x><y></y></1>
開き・閉じタグで、前から一致させると、
<1></x> が対応してしまう
ネストも無限にできるから、対応させるのは無理。
パーサを使うべき
581:デフォルトの名無しさん
18/08/13 00:16:51.60 06GD6VnQ.net
キーワードと構成次第だろ
582:デフォルトの名無しさん
18/08/13 00:22:13.35 LXDaPxOa.net
rubyキチやぞ
583:デフォルトの名無しさん
18/08/13 03:34:58.19 EnLsbSTB.net
>>563
一部の環境では括弧等のネスト構造を取り扱いをサポートした正規表現があるよ
PCRE(Perl 5.10以降)やruby(鬼雲)、Python,PHPなどでも
C#の.NET Framework環境でもあったんじゃないかな
584:デフォルトの名無しさん
18/08/23 19:11:59.52 4kav5HXR.net
.*
何にでもマッチさせることができる最強で万能な正規表現
585:デフォルトの名無しさん
18/08/23 19:26:33.22 FR6Db0Vc.net
改行にはマッチしないけどね
[\s\S]*
586:デフォルトの名無しさん
18/08/24 02:29:36.02 cgE41D9D.net
>>563
> HTML のように、要素に親子関係があるもの・構造化されたものは、正規表現じゃ無理
そういうこともできるように拡張した正規表現があればいいのに
さらに階層、treeも可
587:デフォルトの名無しさん
18/08/24 03:56:55.93 k/tOxHF9.net
>>569
鬼雲使ってみれば?
588:デフォルトの名無しさん
18/08/24 10:28:37.49 bF2ATmvV.net
BNF使えよ
589:デフォルトの名無しさん
18/08/24 10:38:07.25 wb3Q/jKx.net
なんか知識が数年前で止まっちゃってる人がちらほらいるな
正規表現がネストに対応したのなんてもう一昔前ってイメージだけど
590:デフォルトの名無しさん
18/08/24 12:46:08.34 srP6ovAZ.net
別に正規表現だけを追いかけてるわけじゃないから
591:デフォルトの名無しさん
18/08/24 12:48:35.65 ZVlysGry.net
なんでも正規表現で済まそうとするひとって
意地でもVBA使い続けてるひとと大差ない
592:デフォルトの名無しさん
18/08/24 12:49:36.87 yKVFr0CJ.net
適材適所
593:デフォルトの名無しさん
18/08/24 16:58:29.09 k/tOxHF9.net
>>569
てか>>563には>>566のレスが既に付いてたじゃんか
594:デフォルトの名無しさん
18/08/24 18:58:08.09 wb3Q/jKx.net
>>574
賢い人程手段をたくさん知り
その中から取捨選択するからな
>>573
さすがに勉強不足すぎだろw
何年前で知識止まってんだよ
595:デフォルトの名無しさん
18/08/25 00:03:35.46 r5O9PJUC.net
はいはい、正規表現マスターすごいねー
これでいいかな w
596:デフォルトの名無しさん
18/08/25 00:35:41.84 I7tIpqHO.net
底辺に行くほど知識自慢はしかたがないだろ、正規表現に限らず
ただ掲示板的に質問したいのにバカがしゃしゃり出てきて迷惑だよな
597:デフォルトの名無しさん
18/08/25 10:52:22.58 J+b/MRtJ.net
的確な指示されても気に入らない回答だからと人の話を聴かない人は成長しないよ
自分の気に入る回答しかも自分と同じレベルの回答もらって喜んでればいい
598:デフォルトの名無しさん
18/08/26 15:08:37.66 sCPJIsfv.net
俺なんか中学の勉強もロクにしなかったのに正規表現を理解したいから
今、大学レベルの数学を勉強してる・・なかなか進まないけどね・・
>>558 の質問からパーサとか出てくるのはちょっと違うと思うよ
metaタグ拾えばいいだけだよね?難しく考えすぎだよ
あとHTMLソースのほうが糞で実際の文字コードとmetaタグで指定されてる
文字コードが違うなんてことや、文字コードの指定が複数個所あるなんていう
2ページ分のHTMLをそのままくっ付けましたなんていうのも稀にあるから
そういう糞なHTMLを相手にする場合は対応を考えないといけないね
599:デフォルトの名無しさん
18/08/26 15:31:19.41 CE5Lnwmj.net
>>581じゃあmetaタグを拾って来る正規表現をどうぞ
600:デフォルトの名無しさん
18/08/26 15:37:54.94 zPuf2RGr.net
え? そんなことマジで聞いてるのか?
601:デフォルトの名無しさん
18/08/26 15:40:08.95 CE5Lnwmj.net
マジだからちゃんと教えてくれよ
602:デフォルトの名無しさん
18/08/26 18:08:41.45 sCPJIsfv.net
自分用に作るならこんな感じかなぁ、動作確認してないので使わないでね
|
<meta (?=\s) [^<>]* \s charset \s* = \s* (?:["']\s*)? ([^\s"'<>;]+)
|x;
こういうのは想定外 ※ " " の中に > がある
<meta comment="a>b" charset="UTF-8">
603:デフォルトの名無しさん
18/08/26 18:17:10.61 O4hA/SKg.net
>>585
俺が書いた糞(>>561)より糞なコードが書かれて驚く
素直にパーサ使えよ
604:デフォルトの名無しさん
18/08/26 18:36:53.61 sCPJIsfv.net
>>585 のほうがスマートなのは一目瞭然でしょ
ただ >>585 は こんな感じ 程度のものなのでツッコミ所があっても知らないよ
605:デフォルトの名無しさん
18/08/26 18:37:23.43 5oVMxLBv.net
mataタグでのcharsetは定型的でしか使われないんで、仕様的に色々な場合に対応するのは無駄
俺が使うなら、こんなので十分
/<meta[^>]*\scharset=(["'])((?:(?!\1).)+)/i
606:デフォルトの名無しさん
18/08/26 18:52:21.33 sCPJIsfv.net
ほとんどの場合はそれで充分だろうねw
607:デフォルトの名無しさん
18/08/27 04:46:33.83 2QlJLeh2.net
マッチングテスト
[1] <meta charset="UTF-8">
>>559 1. 失敗
>>561 マッチ
>>585 マッチ
>>588 マッチ
[2] このスレのHTML
557 1. マッチ
559 失敗
583 マッチ
586 失敗
608:デフォルトの名無しさん
18/08/29 16:43:59.44 4UnjToZE.net
こんなバカが回答者してたのか
過去レス見ると前から張り付いてるようだね
609:デフォルトの名無しさん
18/08/31 20:05:36.75 5NewXZva.net
なかなか興味深い
鬼雲に非包含オペレータを実装した話
URLリンク(qiita.com)
610:デフォルトの名無しさん
18/08/31 21:09:12.34 5NewXZva.net
bregonig.dll 2017/01/17 Ver.4.10 非包含オペレータに対応
うーん、非包含にマッチする正規表現はいつか自分で作れるように
なりたいと思ってたけど内部で勝手に作ってくれる時代になってしまったか~
自分の知識は2013あたりで止まってるから浦島だ
611:デフォルトの名無しさん
18/09/01 01:28:06.31 0IlLcsWm.net
ab(?~ba)ba
これを
ab((?!ba).)*ba
この従来通りの方式をベースに記述して、かつ、前者とまったく同じ
動作に書き直すことは可能かな?
両者の違いについては>>592のリンク参照
612:デフォルトの名無しさん
18/09/01 22:17:13.09 0IlLcsWm.net
(?~abc)
これは↓とまったく同じ動作になると言って良さそう
(?:(?!abc).)*(?:(?=abc).{1,2})?
否定したい文字列が固定長なら先読みで書き換え可能らしい
613:デフォルトの名無しさん
18/09/12 19:47:12.85 j29ToL0A.net
正規表現を言語化できるようなとこ知りませんか?
/^ab/
これを入れると、
↓
「abで始まる」
と変換されるようなサービスって無いでしょうか?
614:デフォルトの名無しさん
18/09/13 09:47:15.83 l9KSlvFS.net
せっかく正規表現にした意味が無い
615:デフォルトの名無しさん
18/09/13 09:50:19.09 NoauaeTl.net
URLリンク(jex.im)
616:デフォルトの名無しさん
18/09/13 13:28:20.78 a9m+mGXQ.net
視覚的に見れるサイトじゃなくて視覚的に作れるサイトがあったら便利かな
メタ文字を覚える必要が無くなるし動作を把握しながら作れる
そういうのが普及したらいいね
617:デフォルトの名無しさん
18/09/14 00:35:39.11 qC9qAPWt.net
そういうのとはちょっと違う&grepツールになっちゃうけど
TresGrepってのが入力欄でのマウス右クリックから正規表現を指定出来たり
正規表現1文字入力ごとにエラーチェック⇒NGならエラーメッセージを表示したりと
ちょっと便利
618:デフォルトの名無しさん
18/09/14 06:51:39.20 LTbXVNEK.net
>>598
これいいですね。
ありがとうございます。
619:デフォルトの名無しさん
18/09/14 14:14:58.44 grBP2MzP.net
TresGrep使ってみたけど良くできてる
正規表現に何かしらの思い入れがあるのが分かる気がする
特に正規表現の複数行入力が出来るのはいい
自分は複数行入力が当たり前になるべきだと前から考えていて
それが実装されててちょっと感動してしまった
620:デフォルトの名無しさん
18/09/17 12:06:03.62 SR+usNFF.net
C#、System.Text.RegularExpressions.Regexの正規表現で
xxの中を取り出すにはどうしたらいいのでしょう?
ただし取り出したいのはトップのxxで、xxが閉じる前にyyがあるときはそのxxは無視という条件付きです
対象文字列 "<xx><xx><yy>111</yy></xx></xx><xx>223</xx><xx>334</xx>";
試した正規表現 @"<xx>.*?[^(</yy>)]</xx>"
結果
<xx><xx><yy>111</yy></xx></xx><xx>223</xx>
<xx>334</xx>
欲しい結果
<xx><xx><yy>111</yy></xx></xx>
<xx>223</xx>
<xx>334</xx>
621:デフォルトの名無しさん
18/09/17 13:51:51.89 tNilsymD.net
プログラムとはちょっと違うのですが、2chMateで荒らしをNGする正規表現を作りたくて悩んでます
日本語で書くと、
"URLリンク(")<)が合わせてn回以上出てきた場合(対象は複数の改行を含む文字列)
にマッチするような正規表現って可能でしょうか?
622:デフォルトの名無しさん
18/09/17 14:52:47.98 QtMg2HjE.net
>>603
結果と欲しい結果の違いが改行しかないような
>>604
n=3
(?si:https?:\/\/.*?){3,}
623:602
18/09/17 15:04:16.06 tNilsymD.net
>>605
迅速なご回答ありがとうございます。
この方法でうまくいきました!
624:デフォルトの名無しさん
18/09/18 00:00:11.49 lHFpavF+.net
>>603
.NET Frameworkの正規表現は知らんけど、鬼雲でなら
(?=<xx>)(<(\w+)>([^<]*|\g<-3>)*</\k<-2-0>>)
これは最低限のものでイレギュラーなものには対応しない
文字列でエスケープされてるとかコメントが入ってるとか
タグにタグ名以外の余計なものが入ってるとか(</a href=...>とか<br />とか)
ペアでないタグがあるとか(<br>のような単独タグ,<xx>と</xx>のどちらかしかないとか)
そういうのにも対応させるなら工夫して
一応、.NET Frameworkの正規表現の再帰については
URLリンク(qiita.com)
625:デフォルトの名無しさん
18/09/18 00:12:00.46 oPOmCM6y.net
ありがと。もう少し単純にできるかと思っていたけどそんなに複雑になるのね
正規表現使わずにやる方向で考えてみます
626:583
18/09/18 00:55:53.38 t0fL3l18.net
>>607のリンク先見てやっつけで作ってみた
<xx>(?>(?:(?!</?xx>).)*)</xx>|<xx>((?'open'<xx>(?>(?:(?!</?xx>).)*))+(?'-open'</xx>(?>(?:(?!</?xx>).)*))+)*</xx>(?(open)(?!))
627:デフォルトの名無しさん
18/09/18 01:11:05.24 0krUYS0m.net
典型的なダメ質問者だな。
628:583
18/09/18 02:17:30.59 t0fL3l18.net
ミスってた、>>609はボツってことで・・
タグとタグの間の文字列の扱いが意外と難しい
629:デフォルトの名無しさん
18/09/18 06:08:34.66 oPOmCM6y.net
確かにダメ質問者w
「xxが閉じる前にyyがあるときはそのxxは無視」という一見簡単そうなルールが予想以上に難しいようで
楽したいから正規表現使いたいのだけどあまり複雑になると楽じゃないからほかに逃げたくなる
630:デフォルトの名無しさん
18/09/18 07:04:18.68 iA/s8q9i.net
ぶっちゃけ欲しい結果が何なのか結局よく分かってない
<xx>(?:(?<tag><(?!yy>)(?<tagname>[a-z]+)>)*\d+(?<-tag></\k<tagname>>)*(?(tag)(?!)))*</xx>
631:デフォルトの名無しさん
18/09/18 07:13:00.25 oqy73oSH.net
ID変わった
その表現だと <xx><xx><yy>111</yy></xx>
欲しい結果は<xx><xx><yy>111</yy></xx></xx>
こういう尻切れになることが多い
632:デフォルトの名無しさん
18/09/18 07:16:10.21 iA/s8q9i.net
どういうことよ
>>613の正規表現で <xx><xx><yy>111</yy></xx></xx><xx>223</xx><xx>334</xx> にマッチングすると
<xx>223</xx> と <xx>334</xx> にマッチするでしょ?
<xx><xx><yy>111</yy></xx> はどこから出てきたの?
633:デフォルトの名無しさん
18/09/18 07:42:45.15 oqy73oSH.net
申し訳ないミス。"<xx>.*?</xx>"の1件目の結果だったw
その正規表現だと2件マッチ
欲しい結果は>>603にある3件
634:デフォルトの名無しさん
18/09/18 07:46:54.65 iA/s8q9i.net
> xxが閉じる前にyyがあるときは
これは直前ってこと?
<xx><yy>111</yy></xx> にはマッチしないってことでいいの?
635:デフォルトの名無しさん
18/09/18 07:55:40.50 lHFpavF+.net
>ただし取り出したいのはトップのxxで
これだけで<yy></yy>があろうがなかろうが良いと俺は思ったんだけど
636:デフォルトの名無しさん
18/09/18 08:27:12.31 iA/s8q9i.net
yyがどうでもよければ
<xx>(?:(?:<(?<tag>[a-z]+)>)*\d+(?:</(?<-tag>\k<tag>)>)*(?(tag)(?!)))*</xx>
かなぁ
637:デフォルトの名無しさん
18/09/18 08:36:05.56 oqy73oSH.net
閉じる前というのは直前という意味で
対象が"<xx><xx><yy>111</yy></xx></xx><xx>223</xx><xx>334</xx><xx><yy>446</yy></xx>"
の場合は、<xx><yy>446</yy></xx>を無視したの3件マッチにしたい
>>613と>>619ベースできそうだからがんばってみます。ありがとう
638:デフォルトの名無しさん
18/09/18 09:00:26.56 iA/s8q9i.net
まぁスタック使う構文が必要な時点で正規表現向きでないのは間違いない
639:583
18/09/18 12:56:18.97 t0fL3l18.net
本来の数学的な正規表現という意味では向いてる質問なんだけどね
これぞ正規表現の仕事っていう質問
でもプログラムの検索で使う正規表現ではなかなか使われないね
640:583
18/09/18 13:25:09.30 t0fL3l18.net
>>609を修正
<xx>(?>(?:(?!</?xx>).)*)((?'open'<xx>(?>(?:(?!</?xx>).)*))+(?'-open'</xx>(?>(?:(?!</?xx>).)*))+)*</xx>(?(open)(?!))
これは>>607のリンク先の例を↓のように書き換えただけ
< を <xx>・・・
> を </xx>・・・
\A を <xx>
\z を </xx>
「・・・」 は<xx>または</xx>の間に挟まれている文字列
>スタック使う構文が必要な時点で
ああ、その通りだ、(r+s+)+ だけでは作れない
641:583
18/09/18 13:29:58.42 t0fL3l18.net
間違い
\A を <xx>
正しくは
\A を <xx> ・・・
642:583
18/09/18 18:51:49.51 t0fL3l18.net
>>613のはミスってるね
<xx><b><a>111</a></a></xx> にマッチする
<xx><b><a>111</a></b></xx> にマッチしない
この問題は>>619で修正されてる
()* \d+ ()* のところが0回以上のループで正しく動くのは面白いな
一番外側の (?: )* はいらないかも
643:583
18/09/21 05:18:40.73 LI7qokUP.net
(?# 主要部)
<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)?+
)
)
644:デフォルトの名無しさん
18/09/21 05:54:00.34 LI7qokUP.net
こだわった点
・主要部と定義部に分けて全体の構造が分かりやすくした
・繰り返しは全て強欲。無駄なバックトラックをさせない
・再帰には * を使わず、部分呼び出し自身に繰り返しをさせている
・定義部は (?:|(?!) ~ ) として定義部がサーチに使われるのを避けている
>>607には ([^<]*|\g<-3>)* という部分があって
([^<]*)* というバックトラック処理がえらいことになる部分があって気になった
あと再帰を使ってるのにループを * にさせているのを見て
* を使わずに書けるはずだと思って作ってみた
645:デフォルトの名無しさん
18/09/21 06:11:13.31 LI7qokUP.net
こういう書き方をした正規表現をサクラエディタで使おうとすると
1行に繋げなければならない、これでは不便すぎる
鬼雲の強力な正規表現を快適に使い倒せるようにするべき
出来れば複数行で書いた正規表現を1行に繋げる機能が欲しい
そうすればここのような掲示板に貼るときに便利
逆に1行で書かれた正規表現を複数行に直す機能も欲しい
手動でいちいち改行を入れる手間が省けて快適になる
この2つの機能は正規表現ライブラリに実装されることが望ましい
そうすれば他のテキストエディタの作者も気軽に実装出来るようになる
正規表現に新しいメタ文字が作られたときの対応も容易になる
646:デフォルトの名無しさん
18/09/21 06:18:04.46 LI7qokUP.net
出来れば定義用の新しいコマンドが欲しい
定義のためのカッコなのにキャプチャが有効になってたり、
正規表現オブジェクトが無駄に肥大化してしまったりするから
647:デフォルトの名無しさん
18/09/21 07:17:48.30 fJq/snux.net
>>628
> 出来れば複数行で書いた正規表現を1行に繋げる機能が欲しい
ここはム板なので言い出しっぺの法則が適用されます
648:583
18/09/21 19:24:14.97 LI7qokUP.net
>>630
テキストエディタの正規表現の入力ウインドウに付けて欲しいんだ
次世代のテキストエディタは↓こうなって欲しい
1、画面をいっぱいに使って正規表現の複数行の記述が出来る
2、複数行で書かれた正規表現を一行に繋げるボタン
3、一行で書かれた正規表現を複数行に展開するボタン
これがスタンダードになるといいな
649:デフォルトの名無しさん
18/09/21 20:42:25.54 c6u7OXiZ.net
>>631
ガンバ w
650:デフォルトの名無しさん
18/09/21 20:44:43.75 OGYiByDT.net
やっぱそうなるよな ここではw
651:デフォルトの名無しさん
18/09/21 23:08:38.86 3+OghnRP.net
extendedフラグを付けて鬼雲に渡せば、複数行で処理してくれる。
エディタ側で1行にくっつけたりする必要はない。
652:583
18/09/21 23:41:08.24 LI7qokUP.net
>>634
そういうことじゃないんだな、>>628を読んでね
ちなみに複数行の正規表現を一行に繋げるのはかなり簡単なんだけど
一行で書かれた正規表現を複数行に展開するのはかなり難しい
正規表現のパーサを作るということになるから
だから正規表現ライブラリに実装されることが望ましい
ライブラリの作者なら細かい挙動まで把握しているから正確なパーサが作れる
逆にテキストエディタの作者がやろうとすると動作を把握しきれずに
不完全なものになったり、実装を諦めたりすることになりかねない
複数行をスタンダードにするためにはライブラリ側での実装が必須となる
653:デフォルトの名無しさん
18/09/22 02:13:48.20 EPQO3h7N.net
>>635
鬼雲とbregonig.dllの作者さんまでどうぞ
URLリンク(twitter.com)
URLリンク(github.com)
URLリンク(github.com)
URLリンク(k-takata.o.oo7.jp)
あと鬼車オリジナルの作者さんも復活してたんだね
URLリンク(github.com)
(deleted an unsolicited ad)
654:583
18/09/22 21:31:53.89 SLHR4wJP.net
>>636
bregonig.dllはプログラミング用のライブラリをテキストエディタでも
使えるようにしたっていう感じなのでプログラミングに必要のない機能は
付けたくないと思う、管理が大変になるからね
だから次世代の正規表現ライブラリと次世代のテキストエディタに期待
ちなみにテキストエディタに重きを置いたライブラリならこんなのが可能になるはず
検索:( red(?'color='赤) | blue(?'color='青) | yellow(?'color='黄) )
置換:\k'color'
対象テキスト: blue
置換結果:青
現状の bregonig.dll でこれが出来ないということはプログラミングでなんとかなる
機能は付けないということ
テキストエディタのほうは改行をまたぐマッチの実現に苦戦してるようで
この問題が解決しないと高度な正規表現は宝の持ち腐れになるだけなので
次世代のテキストエディタに期待しましょう
>鬼車オリジナルの作者さん
別人だとは知りませんでした^^;
655:デフォルトの名無しさん
18/09/26 01:40:37.36 3FykrnoG.net
xyz? を含まないものにマッチする正規表現
URLリンク(www.din.or.jp)
URLリンク(www.din.or.jp)
> fmcat =(retofm
..のところで導かれている正規表現は明らかにxyやxyzを含む正規表現だけど
これは単なるミスなのかな?こんな難しいことをやってる人がこんなミスを
見逃すとはとても思えないから何か違うものなのかなぁ・・
656:デフォルトの名無しさん
18/09/26 03:09:00.10 Rr41G2Hg.net
明らかに含むって試してから言ってる?
657:デフォルトの名無しさん
18/09/26 10:58:06.87 3FykrnoG.net
>>639
> fmcat =(retofm
で始まる3行のところの正規表現についてですよ?
(~)* x (~)* yz の形なので明らかにxyzにマッチします
*y(x*[^xy]y*)*x* は誤植でしょうけど・・
658:デフォルトの名無しさん
18/09/26 14:05:39.88 pN+YCTD5.net
あー確かににそこはおかしいな
引用っぽいけど
659:デフォルトの名無しさん
18/09/26 23:39:54.65 3FykrnoG.net
やっぱり間違いなんですかね?
プログラムを使って自動的に算出してるようなのに・・
660:デフォルトの名無しさん
18/09/27 00:18:43.29 0xNuoCxe.net
俺もわからんけど、prologらしいから、括弧や表記はスタック順になってるとかでは?
661:デフォルトの名無しさん
18/09/27 02:58:15.53 TOnM2DUW.net
>prolog
なるほど、"xyを含まない正規表現" のところに grail って書いてあったのは
prologとやらの実行ソフト名だったのか
URLリンク(github.com)
これの使い方を調べれば謎が解けそうですね
暇なときに試してみます、ありがとう
662:デフォルトの名無しさん
18/10/06 17:50:41.16 0JYIRqz1.net
検索対象文字 <test>a="akari"desu</test>
正規表現 a="*"
で、検索結果が「a="akari"」でなく、「a="」しか取得できないのはなぜでしょうか?
663:デフォルトの名無しさん
18/10/06 17:56:12.23 e52HQVrn.net
馬鹿には無理
664:デフォルトの名無しさん
18/10/06 18:01:22.57 FAIH8E2E.net
a=\".*\"
メタ文字(ダブルクォート)をバックスラシュでエスケープ
.(ピリオド)で任意文字で0文字以上(アスタリスク)をつければ
とりあえずイケル
それでも意図どおりにマッチングしないことは予見できる
665:デフォルトの名無しさん
18/10/06 18:14:31.01 OZkGL/sg.net
ワイルドカードと混同しちゃってるのか
ワイルドカードと正規表現を同時に使えるTresGrepなら動くかも
666:デフォルトの名無しさん
18/10/06 18:16:35.11 OZkGL/sg.net
正規表現っぽいIDになった?
667:デフォルトの名無しさん
18/10/06 18:23:52.49 OZkGL/sg.net
OZk G L /sg
ohzakiさんゲームのリンク
な気がしたので貼る、最近更新したばっかりやん
ゲーム関係のリンク
URLリンク(www.din.or.jp)
668:デフォルトの名無しさん
18/10/14 12:53:05.30 zaukh1NH.net
>>645
ワロタw
正規表現の*とワイルドカードは違うぞ。詳しくはググれ。
多分a="[^"]*"でいけると思うけど詳しくはググれ。
669:デフォルトの名無しさん
18/10/14 14:33:15.06 eP/1gSav.net
ちょいと質問させて
a="[^"]*"
と書くことが多いんだけど
a=".*?"
と書くのとで結果に違いでるのかな? <
670:デフォルトの名無しさん
18/10/14 14:56:27.64 EqzxaMkD.net
""のなかに改行が含まれてた場合、違いが出るよ
671:デフォルトの名無しさん
18/10/14 15:11:22.83 zaukh1NH.net
あと、.*?は使えない正規表現の処理系があるんじゃなかったっけか。詳しくは(ry
672:デフォルトの名無しさん
18/10/14 15:27:34.24 eP/1gSav.net
>>653-654
なるほど、ありがとうございました
673:デフォルトの名無しさん
18/10/14 22:51:29.78 yTLvFK6H.net
1、<test>a="[^\"]*"</test>
2、<test>a=".*?"</test>
この2つが↓これにどうマッチするか試してごらん
---------------------------------------------------------------------------
<test>a="pokemon"(^-^)</test> <test>a="doramon"</test>
----------------------------------------------------------------------------
674:650
18/10/14 23:38:50.12 wMwKNjnw.net
>>656
サンプルありがとう
でも、そういった検索/置換対象の場合だったら .*? は最初から考えないとは思う
675:デフォルトの名無しさん
18/10/15 00:13:04.80 fKW/Yset.net
この誤爆のことに注意を払えているなら .*? で問題ないよ
[^"] はそういう心配をしなくて良くなるからこっちを予防的に使うのもあり
676:デフォルトの名無しさん
18/10/15 22:36:58.63 fKW/Yset.net
# 文字列 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
);
677:デフォルトの名無しさん
18/10/15 22:37:39.83 fKW/Yset.net
# 文字列 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
);
678:デフォルトの名無しさん
18/10/18 14:54:58.45 s3Db0e4D.net
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] を消せる、完成
679:デフォルトの名無しさん
18/10/18 23:54:36.85 s3Db0e4D.net
こっちのほうがスマートだ..
# 状態遷移図から導かれる正規表現
([^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*
680:デフォルトの名無しさん
18/10/20 20:45:04.19 WB0b2hD6.net
(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)*)*)*$
681:デフォルトの名無しさん
18/10/21 19:43:06.22 7AODCPK7.net
(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* は分岐を無限に増やす入り口のような役割をする
682:デフォルトの名無しさん
18/10/21 23:04:31.26 mkrTRrBN.net
このスレで名前が挙がってたTresGrep、気が付いたらbregonig.dllにも対応してるじゃん
プルダウンのモード切替で.NETの正規表現と切り替えられるのもいい感じ
もうこれでサクラエディタのGrepはお役御免にできるかもしれない
なんだけど・・・rubyの正規表現が全部使えるわけじゃないのに
「鬼雲検索」
を名乗るのはどうなんだろう
683:662
18/10/22 01:40:50.08 oA8lJo/T.net
>>665
ちょろっと試してみたけど戻り読みも後方参照も再帰もちゃんと動いたよ?
動かないのがあるならこちらで検証するよ~
684:名無しさん@そうだ選挙に行こう! Go to vote!
18/10/22 07:15:14.86 nc1bV2B+.net
全角スペースを\u3000と書いた場合とか
bregonigだとperl互換じゃない書き方は受け入れてもらえないわけで
685:662
18/10/22 14:03:03.71 oA8lJo/T.net
自分は文字コードの知識が無いので迂闊なことは言えないから
ちょっと調べたことだけ書いておくね
ここで
URLリンク(k-takata.o.oo7.jp)
\u0149 を検索してみるとbregonigでも使えてそうなことが書かれてたよ
686:662
18/10/22 21:23:16.87 oA8lJo/T.net
サクラエディタでいろいろ実験してたら \s が全角スペースにマッチした
サクラエディタ向けの正規表現を作るときには気を付けないといけないな
687:デフォルトの名無しさん
18/10/22 23:33:25.25 aIOUU5bU.net
bregonigは鬼雲の機能限定版(perl互換の正規表現だけが動く)って話をどこかで読んだ記憶があったんだよね
どうせやるなら本家onigmoのRuby版正規表現も全部動くようにすればいいのに、って思っただけなんだ
ちょっと難癖に近いなとは自分でも思ってる
\sもそうだけど\dに全角数字がマッチしちゃって痛い目に合うのもまれによくあること
サクラに限らないんじゃないかね
688:デフォルトの名無しさん
18/10/23 00:10:38.63 W9szHIq5.net
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なので
スレリンク(software板:515番)
に対して、\d{6}がマッチするのはXenoのみである
689:662
18/10/23 00:11:35.27 FESm7ID8.net
なるほど、dll からは ONIG_SYNTAX_PERL しか使えないから
ruby を使い慣れてる人にとっては歯がゆいと..
> \dに全角数字がマッチしちゃって
ですね~、(?a) で防げるようなので覚えておきます
690:デフォルトの名無しさん
18/10/23 00:18:39.55 FESm7ID8.net
レスが被ってしまった..
>>671
ありがとうございます
サクラエディタはUnicode仕様で動いているんですね
う~ん、文字コードの話は難しいなぁ
691:デフォルトの名無しさん
18/10/23 00:24:56.92 W9szHIq5.net
なおUnicodeの空白でも、上記のCc(0009~0085)、LS,PS,Zs(Space Separator)
以外のCf(200b,200c,200d,FEFF)だとどうかなと試したが案の定マッチしなかった
さすがは仕様どおりだ
692:デフォルトの名無しさん
18/10/23 01:02:05.21 FESm7ID8.net
> 200b,200c,200d,FEFF
サクラエディタにIMEパッドから打ち込んで試してみたら同じくマッチせず
# 主要部
(?&sp)
# 定義部
(|(?!)
(?<sp>
(?u)
[\x{200b}\x{200c}\x{200d}\x{FEFF}\s]
)
)
自分がこれ使うことは永遠になさそうだけどとりあえず..
693:デフォルトの名無しさん
18/10/23 03:03:21.50 FESm7ID8.net
>>3
ジオから移転
正規表現パズル
URLリンク(oraclesqlpuzzle.ninja-web.net)
694:デフォルトの名無しさん
18/10/25 14:38:08.86 4OmhnPU0.net
あるファイルパスがありディレクトリのN階層目までのみを抽出したいのですが、正規表現について教えてください
例えばこんな入力のリストがある場合
aaa
aaa/bbb/ccc
aaa/bbb/ccc/ddd/eee/fff
で各リストに対して2階層目までを取得したい場合
aaa
aaa/bbb
aaa/bbb
となるのが期待値です。
((?:¥w+¥/?){1,2})とかしてみたんですが上手くいきませんでした、お手数ですがよろしくお願いします
695:デフォルトの名無しさん
18/10/25 15:23:45.93 RdSksp9Y.net
>>677
正規表現はプログラム言語や正規表現オブジェクトのオプションによって
動作がけっこう変化するので質問するときはそういうの書いてね
[^/]+(?:/[^/]+)?
ただしこれは正しいパスが与えられることを前提としているので注意
696:デフォルトの名無しさん
18/10/25 15:29:23.12 ZE3NVml1.net
/ の数が、0~2
697:デフォルトの名無しさん
18/10/25 15:39:26.06 5Cy/pQlU.net
./ で始まってたらどう数えるん
/ で始まってたら?
698:デフォルトの名無しさん
18/10/25 17:47:09.80 4OmhnPU0.net
>>678
ありがとうございます、perlが希望でしたので次回から書くようにします
例は2階層で固定のようですが、ちなみにn階層目とか可変で書くような場合は下記のような感じで良いでしょうか?
[^/]+(?:/[^/]+){0,n-1}
699:デフォルトの名無しさん
18/10/25 18:40:41.61 RdSksp9Y.net
ああ、N階層までのマッチという質問だったのか、ごめんね
それで合ってるよb
700:デフォルトの名無しさん
18/10/26 10:18:13.83 MwloQati.net
暇つぶしに鬼雲の再帰処理に欠陥がないか探してみたけど見つからなかった
例、\1 を空文字にマッチさせて再帰の無限ループを狙う
()(?<name>a|\1\g<name>c)
例2、<x> を複数使ってマッチするのが空文字ではないように見せかける
(?<x>)(?<x>text)(?<name>a|\g<x>\g<name>c)
701:デフォルトの名無しさん
18/10/26 23:39:01.03 MwloQati.net
・perl 5.22
if ( "a" =~ /^\Fa\E$/ )
{ print "match.\n"; }
else
{ print "no.\n"; }
# 結果: match.
・ サクラエディタ + bregonig.dll (ONIG_SYNTAX_PERL)
検索欄: ^\Fa\E$
テキスト: a
結果: 見つかりませんでした
\F の意味が知りたい..
702:デフォルトの名無しさん
18/10/26 23:58:52.37 MwloQati.net
URLリンク(perldoc.jp)
> \F \E まで畳み込み文字にします
bregonig.dll は Perl 5.14 ほぼ準拠だからまだ未対応らしい
703:デフォルトの名無しさん
18/10/28 00:53:19.71 ZnGbnC1U.net
URLリンク(jane2ch.net)
レス241からの高速化の話題を検証してみた
レス243
>1は例えば (?:http://)~ と、始めの数バイトをグループ化してやると速くなる
検証結果: 速度変わらず
レス245
> : の部分で一旦切れるようにすれば条件は平等になると思う
> (?:http:|ttp:|tp:) が速いわけではないと分かる
検証結果:
1. 10.345 ms
2. 10.560 ms
3. 05.130 ms
結論: (?:http:|ttp:|tp:) は速かった
704:デフォルトの名無しさん
18/10/28 01:36:44.44 ZnGbnC1U.net
<鬼雲のリファレンス>
(?<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} をコピペしなくて済む
とんこ式の とんこ とは発案者の名前とのこと
705:デフォルトの名無しさん
18/10/28 14:53:16.06 ZnGbnC1U.net
これらの記述法には1つ弱点があり
(?<name>ほにゃらら){0}
より前に
\k<name>
が出現すると文法エラーになる
例、
(?<tag>foo \k<name> bar){0}
(?<name>ほにゃらら){0}
\g<tag>
このため定義する順序が限定されてしまう、これは解消されるべき問題である
706:デフォルトの名無しさん
18/10/28 15:07:39.92 ZnGbnC1U.net
↑これの例はおかしいな、このレスは取り消し
707:デフォルトの名無しさん
18/10/28 15:36:10.31 ZnGbnC1U.net
昨日、詳説 正規表現の本を枕の下に置いて寝た
寝ている間に正規表現のパワーがもらえると思ったからだ
すると.. 夢に正規表現の神様が現れた
神様 「 \1 はな、 ${1} と書いてもマッチするんじゃよ」
朝、目覚めると飛び起きてperlを動かしてみた
if ( "aa" =~ /(a)${1}/ )
{ print "match!!\n"; }
else
{ print "no match..\n"; }
実行結果を見た私は奇跡を見ていた
708:デフォルトの名無しさん
18/10/28 20:54:51.63 ZnGbnC1U.net
revilog.com/2012/08/7939.html
> a?[a-z] という正規表現は [b-z]|aa? という正規表現と
> 等価であり置換可能
前者は ab にマッチするが後者は...
> 同様に[a-z]?[A-z]という正規表現は [A-Z]|([a-z][a-z]?)
> という正規表現と 等価であり置換可能
前者は aA にマッチするが後者は...
709:デフォルトの名無しさん
18/10/29 00:52:40.24 BYis7ms7.net
・ 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} でもマッチ
710:デフォルトの名無しさん
18/10/29 01:00:01.03 BYis7ms7.net
perl がマッチするのはもしかしたら内部的にunicodeになってるとかかな
自分はプログラマじゃないんでさっぱり
711:デフォルトの名無しさん
18/10/29 01:09:53.75 BYis7ms7.net
どうやら当たりらしい、unicodeに変換してからマッチしてた
if ( "あ" =~ /\x{3042}/ ) # true
if ( "あ" =~ /\x{82A0}/ ) # false
712:デフォルトの名無しさん
18/10/29 19:52:31.20 BYis7ms7.net
・再帰の穴を狙う2
(str)
(?<name>
(?(1)yes|no)
\g<name>
|inner)
↓これに書き換えると
(?(1)yes) → 文法エラー
(?(1)|no) → 文法エラー
ガードが鉄壁ですごい、ほんと良く出来てるな~
713:デフォルトの名無しさん
18/10/31 16:56:37.48 ZWlmxwfj.net
(?(条件)真の式|偽の式) の不具合を発見
() に "?:" を付けるかどうかで結果が変わってしまう
対象テキスト: 13 に対し、
1、
\A(?<name>1)(?(<name>)(2|3))\z
結果:マッチ
2、
\A(?<name>1)(?(<name>)(?:2|3))\z
結果:みつかりません
bregonig.dll (shift_jis, unicode 両方で確認)
ちなみに対象テキストを 12 にするとどちらもマッチする
714:デフォルトの名無しさん
18/10/31 17:14:05.35 ZWlmxwfj.net
やっぱりこれ欲しいなぁ
検索:( red(?'color='赤) | blue(?'color='青) | yellow(?'color='黄) )
置換:\k'color'
対象テキスト: blue
置換結果:青
これの有無で便利度が数段変わるんだよね
これの代わりに複数回の置換を行うと \G を使うときに困る
同じものを複数回検索するので速度低下に繋がる
715:デフォルトの名無しさん
18/10/31 19:55:08.08 ZWlmxwfj.net
・ (?'name=~' )
変数name の中身をマッチテストする先読みの親戚のようなもの
(?'name' <div> .*? </div> )
(?:
(?'name=~' \A .* abc .* \z)
pattern1 # タグの間に abc があるとき
|
(?'name=~' \A .* def .* \z)
pattern2 # タグの間に def があるとき
|
pattern3 # それ以外のとき
)
これもあると便利だけど (?(name) | ) で代用出来るから必要度は低い
716:デフォルトの名無しさん
18/11/01 00:56:07.61 +M+OiFJp.net
動画を正規表現に変換
URLリンク(www.youtube.com)
検索: ^(.*)タマ(.*)タマ(.*)
717:$ 置換: $1$2$3
718:デフォルトの名無しさん
18/11/01 01:35:03.88 zrOHiVOt.net
ニュタマーハタマーフ
719:デフォルトの名無しさん
18/11/01 17:25:34.93 +M+OiFJp.net
(*^-^*)
720:デフォルトの名無しさん
18/11/01 17:34:43.67 +M+OiFJp.net
>>696 のバグがrubyでも起こることを確認
ruby 2.5.3p105 (2018-10-18 revision 65156) [x64-mingw32]
原因は bregonig.dll でなく Onigumo にあるようだ
これは気付きやすい部類のバグだと思うんだけど
今までバグ報告が無かったようなのが不思議
takata神はここ見てるのかな
721:デフォルトの名無しさん
18/11/01 17:41:25.59 +M+OiFJp.net
# 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
722:デフォルトの名無しさん
18/11/01 23:04:15.23 dBKH7CcG.net
>>693
perlの場合、Encode::decode()でperl内部処理用文字コード(utf8の亜種っぽい何か)に
正しく復号しないと正規表現クラスを正しく使えない。
723:デフォルトの名無しさん
18/11/02 01:26:49.16 XP4jtOby.net
>>704
解説ありがとうございます
ということは今まで自分はperl内部の独自の文字コードにエンコードされた文字列に
対して正規表現を使っていたわけですね、恥ずかしながら初めて知りました
724:デフォルトの名無しさん
18/11/05 20:41:07.84 SJelCvn/.net
>>685
畳み込み文字ってなんですか?
725:デフォルトの名無しさん
18/11/05 23:47:01.14 xCFT0arz.net
(?:
( V ) > (0 -1)
|
( . ) > (1 0)
)
俺も分からん
726:デフォルトの名無しさん
18/11/06 18:39:37.29 4TN3vyid.net
<正常>
(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))
727:デフォルトの名無しさん
18/11/06 19:30:27.97 4TN3vyid.net
<異常>
(1)?
(?(1)(?:2|(3)))
置換: [$2]
対象テキスト: 3
結果: [3]
-----------
<正常>
(1)?
(?(1)(?>2|3)|4)
(1)?
(?(1)(?>2|3)|(?>4|5))
728:デフォルトの名無しさん
18/11/06 19:36:59.61 4TN3vyid.net
>>709 の実験でバグの原因が分かった
1、不要なカッコを取り除く処理が (?: ) を取り去った
2、分岐の "|" の意味合いが変わってしまった
ということだね、原因が分かれば回避が簡単なのでこのまま放置でも良さそう
729:デフォルトの名無しさん
18/11/09 18:21:43.84 BZlL2mTg.net
perl5.14
# 1文字が2文字にマッチ
if ( "fi" =~ /\A\x{fb01}\z/i ){ print "true\n"; } else { print "false\n"; }
730:デフォルトの名無しさん
18/11/09 18:52:26.91 BZlL2mTg.net
if ( "K" =~ /\A\x{212A}\z/i ) true
if ( "K" =~ /\A\x{212A}\z/il ) false
731:デフォルトの名無しさん
18/11/09 21:22:21.15 BZlL2mTg.net
if ( "\x{212A}" =~ /[[:print:]]/ ) true
if ( "\x{212A}" =~ /[[:print:]]/a ) false
732:デフォルトの名無しさん
18/11/10 00:04:00.21 EY2CMtcP.net
\d{0,32766}
# ok
\d{0,32767}
# error "Quantifier in {,} bigger than 32766 in regex;"
733:デフォルトの名無しさん
18/11/10 00:21:29.46 EY2CMtcP.net
# \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
734:デフォルトの名無しさん
18/11/10 18:21:06.77 EY2CMtcP.net
# 検索表現の途中にある \G をマッチさせる
my $str = 'abcde';
$str =~ /abc/g;
if ($str =~ /abc\Gd/){ print "true\n"; } else { print "false\n"; }
735:デフォルトの名無しさん
18/11/13 00:16:05.06 QabZTjVa.net
# (?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
736:デフォルトの名無しさん
18/11/13 05:19:20.83 QabZTjVa.net
## (?{code}) を使って >>697 の置換
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> .
## バックトラックの対応、成功
737:デフォルトの名無しさん
18/11/13 21:32:36.34 QabZTjVa.net
# 仲間外れを探せ
if ("\x{1990}" =~ /
\N{U+1990}
#\N{1990}
#\N{NEW TAI LUE LETTER HIGH NA}
/x){ print "match.\n"; } else { print "false.\n"; }
738:デフォルトの名無しさん
18/11/14 10:41:07.07 Hh1ptiAj.net
717
739:デフォルトの名無しさん
18/11/14 14:37:49.07 duOGmOFb.net
ワロタw
740:デフォルトの名無しさん
18/11/14 18:45:40.17 I91AeKub.net
このクイズだか検証だかよくわからんの書き連ねてるのは何なの?
一人で無意味に書き連ねてるの?誰かとやりとりしてるの?
741:デフォルトの名無しさん
18/11/14 23:41:31.78 cpUdYoRF.net
正規表現の勉強をしながら気付いたことをメモってるだけです
基本的には一人でやってます
仲間が欲しい...
742:デフォルトの名無しさん
18/11/14 23:44:34.67 CNd6PM4x.net
ここはお前のチラシの裏なのか
ある程度まとまってんならともかくメモ書きなら他所でやれよ
743:デフォルトの名無しさん
18/11/15 00:11:59.19 Ow4iH1sO.net
需要ないかな?無いならやめます
744:デフォルトの名無しさん
18/11/15 22:32:34.48 IM0UsOCP.net
無いよ
745:デフォルトの名無しさん
18/11/16 17:20:00.59 eADG8kUk.net
bregonig.dll の (?a)\w の処理速度が遅い
(?u)\w と同じ速さ
\s や \d や [a-zA-Z_] より4倍の遅い
改善の余地ありそうだね
746:デフォルトの名無しさん
18/11/17 03:22:15.33 YADh6pBI.net
## (?(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になる
747:デフォルトの名無しさん
18/11/17 12:49:09.25 Oiq/x6oK.net
いつまで続くの?
748:デフォルトの名無しさん
18/11/21 19:34:31.80 CU3gUCH4.net
●Regular Expressionの使用環境
C#
●検索か置換か?
置換
●説明
先頭の全角スペースのみを置換したい
先頭の全角スペースは1文字の場合もある
●対象データ
ああああ あ あ あ あ あ
●希望する結果
空空空ああああ あ あ あ あ あ
749:デフォルトの名無しさん
18/11/21 23:39:43.26 UsYfXb0d.net
>>730
Regex.Replace(str, @"(?<=^\s*)\s", "空");
750:デフォルトの名無しさん
18/11/21 23:41:52.91 UsYfXb0d.net
あ全角スペースか
\sを全角スペースに変えて
751:デフォルトの名無しさん
18/11/22 01:15:55.43 YNRtrxPu.net
可変長の戻り読みは便利だけどコールバックで処理するのが普通じゃないかな
URLリンク(ideone.com)
752:729
18/11/22 03:09:11.69 YAZbwzDX.net
>>733
たしかにそっちの方が倍くらい速かった
ちなみに正規表現関係ないけど
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
753:break; とかにするとさらに10倍以上速かった 正規表現使わないでもいい時はなるべく使わないほうがええね
754:デフォルトの名無しさん
18/11/22 11:43:47.30 sD3Vu3lJ.net
>>731-734
どうもありがとうございました
755:デフォルトの名無しさん
18/11/26 03:08:54.11 bvNwlvbS.net
Regex.Replace(str, @"\G ", "空");
でもいけるよ
756:デフォルトの名無しさん
18/11/26 06:49:56.12 OBhrl1nm.net
>>736
・・・っ、すごい。サクラエディタとかでも使える。
\Gのありがたみ知らなかった。私は、まだまだ精進が足りないようだ。
757:デフォルトの名無しさん
18/11/27 00:09:50.92 5gbDlA47.net
\Gを知らないのに正規表現を使いこなせるということはproxomitronのユーザーさんかな
758:デフォルトの名無しさん
18/11/28 15:10:22.46 N4CCGDXj.net
\Gの使い方を覚えたら>>716が面白く感じるかもね
知ってれば今更感しかないが
759:デフォルトの名無しさん
18/11/29 02:42:35.12 Fz25AUlj.net
>>507-508
すごい
こういう書き込みが初心者の質問とその回答で埋もれてしまうのはもったいない
質問スレとは別に正規表現の本スレらしいスレがあるといいな
760:デフォルトの名無しさん
18/11/29 02:52:05.30 rs9fzmaE.net
頑張ったなぁとは思うけど URLリンク(regex101.com) じゃあかんかったか?とも思う
というかリンク貼れんの? URLリンク(goo.gl)
761:デフォルトの名無しさん
18/11/29 08:19:27.68 nDdllTwV.net
自分で立てればいいのになんで他人頼みなの?
762:デフォルトの名無しさん
18/12/02 03:28:37.05 s0yCsMa3.net
>>740
じゃあ俺が立てるわ、テンプレの準備にちょっとかかるが
763:デフォルトの名無しさん
18/12/08 16:06:50.58 7G2k61ed.net
twitter.com/munesuk
enya_go/status/1071188833515954176
先輩w
764:デフォルトの名無しさん
18/12/08 20:04:57.14 RNQqcEtu.net
アンド検索をしたいのですが、どう書けばいいでしょうか
^(?=.*あああ)(?=.*かかか).*$
このコードを見つけました
あああ と かかか の含まれる行がヒットします
ただ、ロジックがちょっとわかりません
先読みをつかっているのですが、先読み対象の語が指定されていません
これはどういうことでしょうか
分かりやすい解説サイトでもあれば教えてください
765:デフォルトの名無しさん
18/12/08 20:32:25.49 Dx33rAX6.net
このへんかな
>正規表現で論理積(AND)を実現する
>URLリンク(qiita.com)
自分流のちょっと乱暴な理解解釈だと
1. (?=検索対象) は、この条件が満たされないと後続のマッチを調べない
2. (?=検索対処) 自体は、この条件が満たされてた時点である意味消滅したかのようにふるまう
って動きを取るような感じ
ちなみにAND検索ができるgrepツール(TresGrep)がどんな正規表現を組み立てるか調べてみたら
「xxx&yyy&zzz」
↓
「xxx.*?(yyy.*?zzz|zzz.*?yyy)|yyy.*?(xxx.*?zzz|zzz.*?xxx)|zzz.*?(xxx.*?yyy|yyy.*?xxx)」
なんてのを吐き出した
安直だけどまあこれも間違ってはいない
766:デフォルトの名無しさん
18/12/08 20:35:48.50 Dx33rAX6.net
あ、先読み対象の語は「^」だけで
「行頭から始まるという条件さえ満たせば何でもよ
767:い」と指定してる
768:デフォルトの名無しさん
18/12/08 22:19:09.33 7G2k61ed.net
環境が分からない
何を検索したいのか分からない
>先読みをつかっているのですが、先読み対象の語が指定されていません
??? 指定されてないって何のことだろう、意味不明
正規表現うんぬんの前にまともな質問の仕方を学ぶべき
769:デフォルトの名無しさん
18/12/08 22:26:59.96 RNQqcEtu.net
>>746
先読み対象は行頭ということですね
^(?=.*あああ)
これだと意味としては
「あああの前に行頭が存在すればヒット」
ということになると思います
これってもう少しかみ砕いた表現にできませんか?
まだ、理解が追い付いてないです
行頭が存在すればヒットということは、「行の中にあああがあればヒット」と同じことですか?
770:デフォルトの名無しさん
18/12/08 23:05:31.04 hZepSGXS.net
>>749
^は検索位置を示すもので、先頭を表す記号、
(?=)は先読みで検索開始位置を移動しないもの
つまり、
^(?=.*あああ)
は、先頭から(改行までの間に)文字列「あああ」がある場合
(先読みなのでマッチ後も次の検索開始位置はまだ先頭のまま)
よって
^(?=.*あああ)(?=.*かかか)
は、先頭から(改行までの間に)「あああ」があり、且つ先頭から「かかか」がある場合
.*$は不要だが、付けると、改行が存在すると絶対マッチしなくなる点が異なる
771:デフォルトの名無しさん
18/12/09 06:54:41.50 C3Qast1U.net
↑かっこを二つならべると、()と()という感じで、アンドになるんでしょうか?
あと
(?=)は先読みで検索開始位置を移動しないもの
の部分なんですが、検索開始位置を移動しないというのはどういうことでしょうか
?=キーワード
で設定した場合、キーワードの相対位置から前を検索する、という認識でした
772:デフォルトの名無しさん
18/12/09 08:43:46.17 UT294bNs.net
質問者は正規表現の基礎知識が足りてないと思われる
たとえるなら、(?=)の先読みは高校受験レベルで求められる英文法だとすると
質問者の場合は入門レベル(そもそもの基本ルールとか「.*」とか)の知識がごそっと抜けてる
なのでここまで出てきた説明を読んでもちんぷんかんぷんにしかならないのだろう
ちょっと遠回りになるけどちゃんと正規表現の基礎を理解したほうがいい
URLリンク(qiita.com)
あたりを最終回(その4)まで読め
それでも理解できないなら、貴方には正規表現を扱うのは無理だからあきらめろ
773:デフォルトの名無しさん
18/12/09 09:50:40.98 vJutpfX/.net
>>751
()()でandになるわけではなく、()の次に()があるかどうかとなる(順序関係ができている)
^(a)(b)と書くと、abにはマッチするがaやbやbaにはマッチしない
これは、^(a)がマッチした時点で検索位置がaの次に移動しているためである
^(?=a)(b)と書くと、何もマッチしなくなる
これは先頭からaが見つかった場合、検索開始位置が移動しないため(?=a)を検索する前のまま(つまり先頭)になっている
次にbが先頭にあればいいわけだがそこにはaがあるからマッチしない
774:デフォルトの名無しさん
18/12/09 10:39:42.84 bsA2M6bZ.net
ID:vJutpfX/
頭が良すぎて教えるのが下手なパターン
バカ語で話さないと通じないよ
775:デフォルトの名無しさん
18/12/09 10:51:59.84 bsA2M6bZ.net
こんな最低限のこともググらず、自分で努力せずに人に聞くようなのに
教えてはいけないと思う、居ついてしまうからエサを与えないで欲しい
776:デフォルトの名無しさん
18/12/09 11:55:43.32 C3Qast1U.net
>>753
動かしながら覚えてみます
ありがとうございます
777:デフォルトの名無しさん
18/12/09 12:38:27.41 H3JhKeet.net
動かしながら覚えるんじゃなくて
>>752でも何でも良いけど、説明読んで覚えて欲しい
中途半端な事してるから、>>751みたいに間違った解釈になるんでしょ