[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 1001- 2ch.scのread.cgiへ]
Update time : 02/26 17:48 / Filesize : 330 KB / Number-of Response : 1037
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

Regular Expression(正規表現) Part14



1 名前:デフォルトの名無しさん [2017/03/15(水) 02:04:35.47 ID:e01p03UP.net]
Regular Expressionスレです。

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

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


次スレは>>980宜しく
天ぷら等2以降

930 名前:ェ俺の主張であり、JavaScriptスレに勝手に依頼しておいた。
以前RegExp.testの件で同様に依頼したら追記されたから、そうなるのを願っている。
そういう、「落とし穴」は共同して塞いでいかないと駄目なんだよ。

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

そういうのではなくて、バグを修正するとか、仕様書に明記するとか、
何でそういう建設的な方向に努力出来ないんだ?
こういう地道な積み重ねを全くやってないからRubyの現状はあるわけでさ。
[]
[ここ壊れてます]

931 名前:デフォルトの名無しさん mailto:sage [2019/07/18(木) 16:11:19.79 ID:Y8yxmCyC.net]
今の複雑化した正規表現エンジンってエンジンを作った人ですらどう動くのか
予測が難しいところがあるのでは

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

あとrubyの正規表現エンジンは空文字マッチが〜の件は
つまりonigmoのことを言ってるんだけどonigmo自体は空文字マッチに
対応してると記憶してるからrubyモードの仕様なんじゃないかな

932 名前:デフォルトの名無しさん mailto:sage [2019/07/18(木) 20:03:10.71 ID:PnG1z3PK.net]
>>904
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界隈にはまともなプログラマがいないからだよ。

933 名前:デフォルトの名無しさん mailto:sage [2019/07/18(木) 20:22:20.04 ID:Y8yxmCyC.net]
BREという超シンプルな正規表現エンジンが持っていた明解な動作の分かりやすさを
現代の超複雑な正規表現エンジンに求めることには無理がある

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

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

時代遅れのプログラマが何を言おうが正直興味ないわ
現代の正規表現で見れば初心者だし
初心者が内部動作の仮説を立てたところで当たるわけがない
しかもたった数例のコードの動作を見ただけでだ、あほらしい

934 名前:デフォルトの名無しさん mailto:sage [2019/07/18(木) 20:44:40.06 ID:PnG1z3PK.net]
>>904
お前みたいなゴミに回答する意味はないが、一応つけておいてやる。

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

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

正規表現エンジンなんてプログラミング全体からするとかなり簡単な部類だ。
動けばいいだけのエンジンなら再帰しまくりで1000行程度だろう。
最悪全交換でいい規模だから、そこまでガチで整備されている事は期待出来ないが、
それにしてもこの程度の規模のプログラムを読めない、ってことはあり得ない。
高速化はプログラムに対して「複雑度」を増すものではない。
具体的に言うと、静的コールグラフを複雑化することはなく、
単に遅い関数を速い関数に入れ替える、というのが基本になる。
だから、正規表現エンジンを読めない、というのなら、書いた奴か読む奴が馬鹿なだけであって、
ちゃんとした奴が書いたエンジンをちゃんとした奴が読めば確実に読める。

935 名前:デフォルトの名無しさん mailto:sage [2019/07/18(木) 20:46:26.35 ID:PnG1z3PK.net]
> バグと言えばバグだけど
単なるバグだ馬鹿タレ。
> 総合的に考えてみてこの動作が最適だからこのままにしようという部分もたくさんあると思う
非互換になるのでどこでアップデートして修正するかは言語側の選択となる。
だからその前段階、つまり今どこにバグがあってどれくらい問題なのか把握し、
それを広報して共有し、どのタイミングで修正するかを話し合わないといけない。
Rubyはこれが全く出来てない。だからゴミのままなんだよ。
> だから怠慢という言葉はちょっと違う気がするなぁ
バグだと認識した上で、それを仕様として広報するのが最低の義務。
JavaScriptとPerlはそれをやっている。
Rubyの現状はバグに気づいてないか、敢えて黙っているかで、どちらにしても糞でしかない。

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


>>906
まあ書いた後に読んだから投稿はしておいた。
話すつもりがないのならさようならでいい。
お前は、自身の問題を認識出来てないタイプだ。まあこのタイプもよくいるが。

936 名前:デフォルトの名無しさん mailto:sage [2019/07/18(木) 21:56:03.46 ID:xdHI+pcE.net]
荒らしと会話するな!
荒らしと会話する者も、荒らしだぞ!

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

そいつらは荒らしだから、会話するな!

937 名前:デフォルトの名無しさん mailto:sage [2019/07/18(木) 22:31:51.56 ID: ]
[ここ壊れてます]

938 名前:PnG1z3PK.net mailto: >>909
お前はコードだけで語りすぎだけどな。
結論を書くようにしろよ。


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

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

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

まあ確実に言えるのは、Rubyを今から学ぶのは止めとけ、ってことだ。
Rubyはコミュニティの腐り方がどうも他とは違う。
(JavaScriptも腐ってはいるが、あれは「若すぎる」のが原因だ。
かといって放置しても自然に改善するものでもないが)
[]
[ここ壊れてます]



939 名前:デフォルトの名無しさん mailto:sage [2019/07/19(金) 00:09:18.78 ID:KcCrOwH9.net]
PCREに非包含オペレータが搭載されたら起こしてくれ

940 名前:デフォルトの名無しさん mailto:sage [2019/07/19(金) 00:50:19.02 ID:CNkXpMDT.net]
>>911
というかお前もそうだが、onigmo使ってるなら何で試して動作報告してくれないんだ?
そういうところがRubyのコミュニティはおかしいんだよ。
「みんなで前に進む」という感覚がない。

ちなみに
> 鬼車の中の人と Ruby の間の確執がなければとっくの昔に実装されていたのだろうかと思ったり思わなかったり。
> https://qiita.com/k-takata/items/4e45121081c83d3d5bfd
これって何?知ってたら教えてくれれば助かる。

941 名前:デフォルトの名無しさん mailto:sage [2019/07/19(金) 02:29:00.41 ID:CNkXpMDT.net]
>>911
入る予定なんてないだろう。
> 8.2 Perl
> Perl には最短一致の繰り返し、バックトラック
> の抑制、否定先読みがある。これにより、非包含オ
> ペレータに似た効果を得ることができる。しかし、
> 7.2 節で詳しく述べたようにこれらは形式言語理論
> からすると適切に扱えず、正規表現の組合せなどに
> 問題が生じる。

> https://staff.aist.go.jp/tanaka-akira/pub/prosym49-akr-paper.pdf
つまり理論畑の人には問題があるが、プログラミング上問題はないんだろ。
そりゃ入れないだろ。

942 名前:デフォルトの名無しさん mailto:sage [2019/07/19(金) 03:16:00.34 ID:CNkXpMDT.net]
>>912
自己レスだがだいたい分かった。
その他はリンク切れが多くて詳細までは追えないが、どうやら、勝手に使ったことに対して怒っているらしい。
https://kkos.hatenadiary.org/entries/2007/05/25#1180100250
が、ライセンス違反でなければ勝手に使え、というのがBSDだし、
告知しなかったことに関してはRuby側が悪いわけでもない気がするが。

ただこれなら鬼車にはRubyバグを作り込む必要がないから芽がある気はする。
そして文句を言ったところで鬼雲にフォークしてマージしたのなら実質大して変わらない気もする。
よく分からん所で喧嘩してるなとは思う。

943 名前:デフォルトの名無しさん mailto:sage [2019/07/19(金) 11:33:59.54 ID:bgAzEf51.net]
このスレでコミュニティうんぬんは脱線しすぎじゃないかい。スレタイとなんも関係ないやろ。

944 名前:デフォルトの名無しさん mailto:sage [2019/07/20(土) 15:46:35.52 ID:KXtQuYxh.net]
本当にプログラマなのかな

945 名前:デフォルトの名無しさん mailto:sage [2019/07/20(土) 17:29:27.69 ID:AFOF1ubv.net]
JS

946 名前:です
「はい」「はい」
「うん」「うん」
「■●」「■●」
「△◎」「△◎」
など、同じ文字列2回(あるいは2回以上)の繰り返しを探すにはどうすればよいでしょうか?

/「(.+)+」/
とかだと、1回目と2回目が違ってもヒットしちゃいますよね…?
[]
[ここ壊れてます]

947 名前:915 mailto:sage [2019/07/20(土) 17:31:58.05 ID:AFOF1ubv.net]
>>917
例を全部2文字にしちゃいましたが、 .+ と書いているとおり別に文字数は関係ありません

948 名前:915 mailto:sage [2019/07/20(土) 17:37:46.94 ID:AFOF1ubv.net]
>>917
そして度々すみませんが /「(.+)+」/ じゃなくて /「(.+)」+/ でした
とりあえずこれはダメな例ということで
いい例が知りたいです



949 名前:デフォルトの名無しさん mailto:sage [2019/07/20(土) 17:45:51.81 ID:kkJ7q95a.net]
>>917-918
https://qiita.com/y-ken/items/7d5bf086be68d23e1318

950 名前:デフォルトの名無しさん mailto:sage [2019/07/20(土) 20:12:32.11 ID:AFOF1ubv.net]
>>920
3つ目の

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

ですね、ありがとうございます…!

951 名前:デフォルトの名無しさん mailto:sage [2019/07/21(日) 20:31:55.31 ID:Bdf0kkIf.net]
>>914
ttps://kkos.hatenadiary.org/entry/20070906/1189084566
松本氏はrb_enc_mbclen()のインターフェースが不適切であるという指摘に対して、何故、その原因を私に責任転嫁したのでしょうか?

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


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


現在のインタフェースになっている原因が「鬼車がそうなっていたから」であり、その理由は「まつもとがGB18030のようなエンコーディングへの対応に対する関心が薄かった」ということです。
「だったら、最初からそう書けよ」と言われそうですが、すいません、言葉が足りませんでした。

952 名前:デフォルトの名無しさん mailto:sage [2019/07/22(月) 01:27:11.95 ID:dN38X5eV.net]
>>922
おおサンクス。
ただ、それって 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氏の判断は妥当だ。

953 名前:デフォルトの名無しさん mailto:sage [2019/08/01(木) 15:57:12.21 ID:BVNOJ7mG.net]
>>791やってくれる人はいないか〜
2ch全盛期なら誰かしらやってくれた可能性高いけどすっかり寂れたな

onigmoに興味があるならtakata氏の日記を読破してみてはどうかな
作りながら考えてたことが分かって面白かったよ

954 名前:デフォルトの名無しさん mailto:sage [2019/08/24(土) 12:41:17.80 ID:fR0bFJ1E.net]
perlで

(?<=(aa|bb))c

ならokだが

(?<=(aa|bbb))c

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

秀丸のHmJre.dllだと通るようだ

955 名前:デフォルトの名無しさん [2019/08/24(土) 13:46:10.60 ID:6nD2xE5w.net]
(?<=(aa.*|bbb))c

956 名前:デフォルトの名無しさん mailto:sage [2019/08/25(日) 15:17:23.04 ID:GRZE+Rz9.net]
(?<=aa|bbb)c

957 名前:デフォルトの名無しさん mailto:sage [2019/09/01(日) 12:33:19.59 ID:fodjUzDJ.net]
JS(ES2017)です

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

CJKとか言って一緒くたになっている以上、Unicode範囲指定などで判別することはできないですかね…?

958 名前:926 mailto:sage [2019/09/01(日) 12:38:35.03 ID:fodjUzDJ.net]
「樣」は一応日本語でも使うみたいですね…
とりあえず常用漢字じゃなければ弾くくらいでもいいのですが
常用漢字表を作って比較するくらいしかない…のかな?



959 名前:デフォルトの名無しさん [2019/09/01(日) 13:31:25.10 ID:kCJZVLuH.net]
www.shuiren.org/chuden/teach/code/main8.htm

960 名前:デフォルトの名無しさん [2019/09/01(日) 13:35:35.35 ID:kCJZVLuH.net]
ねむい
kanji.zinbun.kyoto-u.ac.jp/~yasuoka/CJK/gb2312-80.gif
kanji.zinbun.kyoto-u.ac.jp/~yasuoka/index-j.html

961 名前:デフォルトの名無しさん mailto:sage [2019/09/01(日) 18:46:39.31 ID:VXfAHt8z.net]
>>929
樣は様の旧字で現在でも許容字体扱いだから「常用漢字表」にも
出て来る。
https://ja.wikipedia.org/wiki/%E5%B8%B8%E7%94%A8%E6%BC%A2%E5%AD%97%E4%B8%80%E8%A6%A7

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

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

JISの範囲内だけがほしいならシフトJISで保存したら他は
疑問符になるだろうからそれをまとめて削除したらおしまいだろうが
繁体字の樣は残る。簡体字の[木羊]

962 名前:は消える。 []
[ここ壊れてます]

963 名前:デフォルトの名無しさん [2019/09/01(日) 21:04:09.80 ID:fO6VcsLE.net]
Google謹製の正規表現ライブリ「re2」でググったら「バイオハザード2 RE:2」が検索上位に来るのどうにかならない?

964 名前:デフォルトの名無しさん mailto:sage [2019/09/01(日) 22:01:25.54 ID:Zrnas7uJ.net]
>>933
s/^(.+)でググったら「バイオハザード2 RE:2」が検索上位に来るのどうにかならない?$/$1/

965 名前:デフォルトの名無しさん mailto:sage [2019/09/01(日) 22:50:02.12 ID:8GDP8quV.net]
RE2 regex とか RE2 正規表現 とかでググれば

966 名前:デフォルトの名無しさん mailto:sage [2019/09/10(火) 22:48:57.92 ID:CokwQGf+.net]
直前の文字が1回以上出現することが確実なケースで、仮に0回の出現として考慮しても問題がないという場合に、
+ではなく*で正規表現を記述する理由はありますか?

例えば、慣例として*のほうを使うとか、*とするとマッチしない場合のみ+を使うとかそういう

967 名前:デフォルトの名無しさん mailto:sage [2019/09/10(火) 23:21:08.02 ID:1dbF51qB.net]
0回も許容するなら+ではなく*にする理由は0回も許容するからとしか

968 名前:デフォルトの名無しさん mailto:sage [2019/09/10(火) 23:26:41.78 ID:L5QX1JAH.net]
具体例で示してくれんとなんか曖昧でよくわからんね



969 名前:デフォルトの名無しさん [2019/09/11(水) 12:05:55.89 ID:zFEVPQj4.net]
>1回以上出現することが確実なケース

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

矛盾してるな

970 名前:デフォルトの名無しさん mailto:sage [2019/09/11(水) 15:12:05.49 ID:wb8QVF41.net]
>>936
出現が確実ではあるが、もしなかった場合にも対応したい
そういう要求があり、動作にも差し支えない場合なら * をつかう
ということに尽きるでは?

971 名前:デフォルトの名無しさん mailto:sage [2019/09/11(水) 16:12:55.15 ID:h8Pfy2ne.net]
>>764

972 名前:デフォルトの名無しさん mailto:sage [2019/09/12(木) 02:26:26.53 ID:xpiKRNxb.net]
やっぱ質問して放置か、教える側も学習すべきだな
まともな質問じゃないと思ったらスルーでいい

973 名前:デフォルトの名無しさん mailto:sage [2019/09/12(木) 04:33:29.68 ID:+6m2JHnd.net]
別におかしな質問じゃないだろ

974 名前:デフォルトの名無しさん mailto:sage [2019/09/12(木) 06:58:37.97 ID:1ik9S0iw.net]
いや普通におかしいだろ
なんか無理矢理の条件考えて論争させようとしてるような気がする

975 名前:デフォルトの名無しさん mailto:sage [2019/09/12(木) 08:21:20.40 ID:xpiKRNxb.net]
自分なら人にこういう質問レスを書くかなって考えてみて絶対書かないと
思うものにはレス付けないのがいいかもね
説明不足で意味不明なものとかも

976 名前:デフォルトの名無しさん mailto:sage [2019/09/12(木) 09:22:01.93 ID:TOasMGF3.net]
●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,}"で検索は出来たのですが置換が思い浮かびません

977 名前:デフォルトの名無しさん mailto:sage [2019/09/12(木) 10:00:21.41 ID:bJPykHLq.net]
わかりやすいように、できるだけそのまま書くならこうかな

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

●置換文字列
\1\2

978 名前:デフォルトの名無しさん mailto:sage [2019/09/12(木) 10:04:35.65 ID:bJPykHLq.net]
置換に問題は無いけど()が二重になってたミス修正
(id="|\G )(\d+[A-Z]\d+)[a-z]



979 名前:デフォルトの名無しさん mailto:sage [2019/09/12(木) 10:30:50.86 ID:TOasMGF3.net]
>948
出来ました!
ありがとうございます。

田中哲スペシャルっていうやり方なのでしょうか

980 名前:デフォルトの名無しさん mailto:sage [2019/09/12(木) 11:08:37.62 ID:bJPykHLq.net]
\Gは照合開始位置と呼ばれる物で、マッチした箇所の後の境界にマッチしてくれるので
さっきのように(特定の文字列or前回置換しところ)の後に置換したい文字列があるときとかに便利で定番

田中哲スペシャルは\gで同じ表現をもう一回使うって奴だから違うかな

981 名前:デフォルトの名無しさん mailto:sage [2019/09/12(木) 11:58:31.87 ID:TOasMGF3.net]
>950

勉強になります。

ちなみに最初の値にはアルファベットがついてないケースだと拾えなかったので

982 名前:すが
id="97B22 95D18a 93B22c 93E23b"

対応策ありますでしょうか?
[]
[ここ壊れてます]

983 名前:デフォルトの名無しさん mailto:sage [2019/09/12(木) 12:04:38.94 ID:xpiKRNxb.net]
自分ならこの時点でスルー
\Gは文頭にもマッチするから誤爆対策を忘れずに

984 名前:デフォルトの名無しさん mailto:sage [2019/09/12(木) 15:04:33.55 ID:bJPykHLq.net]
>>951
自分でも書けない訳じゃないみたいだし、魚を与えるより釣り方を教えよの精神でヒント
変更のない置換後でも\Gは引っかかるので、小文字がないidも全部マッチするようにすれば

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

あと>>952が指摘してくれたように誤爆が懸念されるので、\Gを\G(?<=.)にした方が良いかもしれない
●対象データが正確で、実際の対象もidのみが載ったリスト形式みたいなものなら要らないけど

985 名前:デフォルトの名無しさん mailto:sage [2019/09/12(木) 18:04:49.29 ID:TOasMGF3.net]
>953
ヒントありがとうございます。
残りは自分でがんばってみます。

986 名前:デフォルトの名無しさん [2019/09/12(木) 18:08:37.95 ID:EfYu2rO4.net]
文字列 "プログラマー" を "プロクライマー" に書き換える正規表現を教えて下さい

987 名前:デフォルトの名無しさん mailto:sage [2019/09/12(木) 21:50:17.55 ID:Jdu1U3XN.net]
そこにソースがあるから登るんだ。

988 名前:デフォルトの名無しさん [2019/09/12(木) 22:19:07.70 ID:cqw0/uFd.net]
正規表現の使い方じゃなく作り方、バックトラックなど理論から解説している書籍やそれに準ずるサイトなど知っていたらご教示ください。
こうやればこうなるよ、こういうときはこうすればいいんだよ的な学習では身に付かなくて…



989 名前:デフォルトの名無しさん mailto:sage [2019/09/12(木) 22:56:30.12 ID:Yy9Clfy1.net]
自分が参考にしたのはここだったかな
fussy.web.fc2.com/algo/search5_regex.htm

実装の仕方がある程度分かれば鬼車の作者さんのブログ(rubyの一件以前の記事)も参考になると思う

990 名前:デフォルトの名無しさん [2019/09/12(木) 23:14:33.93 ID:Uy9QyXie.net]
ありがとうございます!
rubyの一件って何ですか?(何て検索したらいいですか?)

991 名前:デフォルトの名無しさん mailto:sage [2019/09/12(木) 23:43:24.49 ID:Yy9Clfy1.net]
Rubyの作者さんと何かあったようで嫌気が差したのかそれ以後ブログで正規表現のことを
取り上げる頻度がめっきり減っちゃったんですよ

992 名前:デフォルトの名無しさん [2019/09/13(金) 08:32:54.25 ID:sQZEDK+j.net]
>>960
ありがとうございます!
なるほど、残念ですね…

993 名前:デフォルトの名無しさん [2019/09/13(金) 10:47:34.78 ID:wKEqF87n.net]
955
https://codezine.jp/article/detail/3158
https://tociyuki.hatenablog.jp/entry/20070222/1172158021
hellocode.jugem.jp/?eid=748

994 名前:デフォルトの名無しさん mailto:sage [2019/09/13(金) 11:54:40.09 ID:X5DxpBbM.net]
正規表現はどの言語でも共通で使えますか?それともちょっと違ったりしますか?

995 名前:デフォルトの名無しさん mailto:sage [2019/09/13(金) 12:02:22.73 ID:KuW4wLhZ.net]
ちょっと違ったりします

996 名前:デフォルトの名無しさん mailto:sage [2019/09/13(金) 13:25:46.31 ID:8XwQqyT8.net]
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"

997 名前:963 mailto:sage [2019/09/13(金) 13:43:10.59 ID:8XwQqyT8.net]
>>965
修正

>ただし、同じ行に、id="〜" が複数あると、バグる!
大丈夫だった。正常に動く

998 名前:デフォルトの名無しさん mailto:sage [2019/09/16(月) 02:45:59.31 ID:dK4dr8mE.net]
JSで



999 名前:
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"]
になってしまい、数字のあとの余計な半角スペースをあとで取り除かなければならなくなるのがなんか嫌で…
[]
[ここ壊れてます]

1000 名前:デフォルトの名無しさん mailto:sage [2019/09/16(月) 02:59:29.74 ID:/xGIA7r1.net]
正規表現を使えないなら文字列操作でやればいいだけ
正規表現を使いこなせてない人が使うとバグの温床になるからお勧めしない

1001 名前:デフォルトの名無しさん mailto:sage [2019/09/16(月) 07:18:26.85 ID:m2l8x1P1.net]
>>967
.split(' ', 2)

1002 名前:デフォルトの名無しさん [2019/09/16(月) 12:07:55.69 ID:oN5KVYJd.net]
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"]]

1003 名前:デフォルトの名無しさん mailto:sage [2019/09/16(月) 15:25:40.41 ID:YU5GpdCi.net]
JSでは、
["30", "8 year old humans"]
ではなく
["30","8"]
となる
limitは、分割結果の制限であり、見つかった要素の数をそこまでで打ち切る

1004 名前:968 mailto:sage [2019/09/16(月) 15:36:25.96 ID:oN5KVYJd.net]
>971
えー!!

1005 名前:デフォルトの名無しさん mailto:sage [2019/09/16(月) 15:52:31.08 ID:YU5GpdCi.net]
>>972
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/String/split#Returning_a_limited_number_of_splits

1006 名前:デフォルトの名無しさん mailto:sage [2019/09/16(月) 16:04:28.98 ID:2suJbq8i.net]
matchじゃなくてsplitで

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



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

とかじゃない?

1007 名前:デフォルトの名無しさん mailto:sage [2019/09/16(月) 16:06:13.84 ID:2suJbq8i.net]
間違えた
下の最後こうか

[array[0], array.slice(1).join(" ")]

1008 名前:デフォルトの名無しさん mailto:sage [2019/09/16(月) 16:24:50.88 ID:VWND3fAL.net]
素直に
"30 8 years old".match(/^(\d+) (.*)$/).slice(1)
じゃいかんの?



1009 名前:デフォルトの名無しさん [2019/09/16(月) 16:28:11.45 ID:53ZoYsUm.net]
正規表現逆引きcgiとかないの?
雑に日本語で書き込んだらAIが判断して正規表現を返してくれる
そんなの

1010 名前:デフォルトの名無しさん mailto:sage [2019/09/16(月) 17:07:19.10 ID:YU5GpdCi.net]
>>976
マッチしない場合でもエラーにならないよう保険かけとく方がよいのでは?
(str.match(/〜/)||[]).slice(1)

1011 名前:デフォルトの名無しさん mailto:sage [2019/09/16(月) 17:20:26.44 ID:oN5KVYJd.net]
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' ]

1012 名前:デフォルトの名無しさん mailto:sage [2019/09/16(月) 17:34:55.93 ID:hRvCpxCQ.net]
>>978
そう言うのは質問者に適宜やってもらえば良い
絶対マッチするという前提かもしれないし

1013 名前:デフォルトの名無しさん [2019/09/16(月) 17:40:28.59 ID:enU8we0d.net]
>>971
知らなかった

1014 名前:デフォルトの名無しさん [2019/09/16(月) 18:09:34.33 ID:enU8we0d.net]
const str = '30 8 year old humans'
(([first, ...rest]) => [first, rest.join(' ')])(str.split(' '))
//=> ["30", "8 year old humans"]

あ、正規表現がねぇw

1015 名前:デフォルトの名無しさん mailto:sage [2019/09/16(月) 20:46:14.05 ID:RGmahsTZ.net]
.split(/ (.*)/,2)

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

テンプレ貼ってたら>>3 がNGワードとやらで貼れません。
というわけであとよろしく。

1017 名前:デフォルトの名無しさん mailto:sage [2019/09/17(火) 10:37:10.53 ID:aFTX7+W5.net]
>>984
>>3
のテンプレにある

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

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

このURL を削除すれば?

MANGO 板で、NG ワードを調べられる

1018 名前:977 mailto:sage [2019/09/17(火) 12:02:24.99 ID:aFTX7+W5.net]
>>979
を修正した

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' ] ]



1019 名前:デフォルトの名無しさん mailto:sage [2019/09/17(火) 16:12:25.16 ID:sjKTVv5w.net]
amazonもダメみたいだね、本の紹介しようとしたら弾かれた

1020 名前:983 mailto:sage [2019/09/17(火) 17:07:52.35 ID:aFTX7+W5.net]
Amazon も、半角で書けないだろ

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

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

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

MANGO 板に書き込んで、何がNG ワードが、地道に判定していくしかない

1021 名前:デフォルトの名無しさん [2019/09/17(火) 17:46:48.25 ID:+bGUkqkJ.net]
test
https://www.ama%7Aon.co.jp/dp/4938939703

1022 名前:デフォルトの名無しさん mailto:sage [2019/09/17(火) 17:53:38.97 ID:Xou3E6HC.net]
はてブのURL、5ちゃんに書けないのか。気づいてなかったわ。

1023 名前:デフォルトの名無しさん [2019/09/17(火) 17:56:58.73 ID:+bGUkqkJ.net]
test
d.h%61tena.ne.jp/keyword/%A5%E2%A5%CE%A5%B7%A5%EA%A5%C3%A5%AF%A5%AB%A1%BC%A5%CD%A5%EB

1024 名前:デフォルトの名無しさん [2019/10/02(水) 17:34:34.60 ID:dOlpIXop.net]
U . M . E

1025 名前:デフォルトの名無しさん [2019/10/12(土) 20:41:17.72 ID:VAjNOt6S.net]
以下を正規表現で行うにはどうしたらよいでしょうか。
-----元データ------------------
<aaa bbb
ccc
ddd>
<eee>
ffff ggg
<hhh
iiii>
-----------------------------
-----欲しいデータ----------------
aaa bbb ccc ddd
eee
ffff ggg
hhh iiii
------------------------------

1026 名前: mailto:sage [2019/10/12(Sat) 20:46:20 ID:osgjxuFW.net]
改行無視のオプション+<>の間を取得して改行を空白に変更でどう?

1027 名前:デフォルトの名無しさん mailto:sage [2019/10/12(土) 22:51:54.37 ID:7TGqmTiW.net]
>>993
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のは一旦改行削除して、<..>の前後に改行追加して、空行削除して、行頭の空白を削除してる

1028 名前:デフォルトの名無しさん mailto:sage [2019/10/13(日) 01:09:33.88 ID:Gu1oNPJo.net]
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", " " ) }

>>995
>$1.gsub("\n", "")
"" は、" "(半角空白)の間違いだろ



1029 名前: mailto:sage [2019/10/13(Sun) 01:37:59 ID:5y3mzviq.net]
>>996
コピペしたら元データに行末スペースが入ってたからそうしたんだけどこれは5chの仕様なのかな?
行末スペースがないなら空文字じゃなく半角スペースに置換だね

1030 名前: mailto:sage [2019/10/13(Sun) 03:33:31 ID:Gu1oNPJo.net]
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

1031 名前:デフォルトの名無しさん [2019/10/13(日) 07:48:23.30 ID:0NSyRtEU.net]
>>994-996
皆さんありがとうございました。
後方参照をさらに置換すれば良かったんですね。そんな方法があったとは!!
助かりました。

1032 名前: mailto:sage [2019/10/13(Sun) 22:01:19 ID:5y3mzviq.net]
>>998
エディタのコマンドで対応できることだから
わざわざスクリプト書くのはちょっとオーバーキルかな

1033 名前: mailto:sage [2019/10/13(Sun) 22:05:59 ID:w1EMiXuT.net]
VScodeの正規表現検索、置換はjavascriptだろうか?

1034 名前: mailto:sage [2019/10/13(Sun) 22:42:48 ID:5y3mzviq.net]
>>1001
ripgrep

1035 名前:1001 [Over 1000 Thread .net]
このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 942日 20時間 38分 13秒

1036 名前:過去ログ ★ [[過去ログ]]
■ このスレッドは過去ログ倉庫に格納されています






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧](;´∀`)<330KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef