[過去ログ]
Regular Expression(正規表現) Part14 [無断転載禁止]©2ch.net (1002レス)
Regular Expression(正規表現) Part14 [無断転載禁止]©2ch.net http://mevius.5ch.net/test/read.cgi/tech/1489511075/
上
下
前
次
1-
新
通常表示
512バイト分割
レス栞
このスレッドは過去ログ倉庫に格納されています。
次スレ検索
歴削→次スレ
栞削→次スレ
過去ログメニュー
1: デフォルトの名無しさん [] 2017/03/15(水) 02:04:35.47 ID:e01p03UP Regular Expressionスレです。 質問する場合は必ず実装言語や処理系ソフトウェア名を示してください。 前スレ Regular Expression(正規表現) Part13 http://echo.2ch.net/test/read.cgi/tech/1415149975/ 次スレは>>980宜しく 天ぷら等2以降 http://mevius.5ch.net/test/read.cgi/tech/1489511075/1
876: デフォルトの名無しさん [sage] 2019/07/14(日) 16:03:14.68 ID: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がない) XPA
TH等の文書検索側の人かな?だからって別に特に問題はないが。 http://mevius.5ch.net/test/read.cgi/tech/1489511075/876
877: デフォルトの名無しさん [] 2019/07/15(月) 15:22:14.71 ID: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"] と同じ結果 http://mevius.5ch.net/test/read.cgi/tech/1489511075/877
878: デフォルトの名無しさん [sage] 2019/07/15(月) 16:42:33.19 ID: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 http://mevius.5ch.net
/test/read.cgi/tech/1489511075/878
879: デフォルトの名無しさん [sage] 2019/07/15(月) 23:23:32.64 ID:3MPTmFRg BREの正規表現と今の正規表現の使い方の違いの話は面白いなぁ しかしこの人こんなにすごいスキルとモチベがあるなら質問なんかせずに 自力でなんとか出来たのではw 質問してくれたおかげで面白い話をいろいろ聞けたからこちらは嬉しいけどネ おかしな挙動と言えばperl5とOnigmoでは\Gの挙動に違いが あってどちらかが違和感のある動作をしたはず \Gの概念自体が微妙に違ったはずだけどメモるの忘れた 興味のある人はぐぐってね http://mevius.5ch.net/test/read.cgi/
tech/1489511075/879
880: デフォルトの名無しさん [sage] 2019/07/16(火) 15:24:59.03 ID:wQsYVdH6 ネット弁慶がイキりたかっただけでしょ http://mevius.5ch.net/test/read.cgi/tech/1489511075/880
881: デフォルトの名無しさん [sage] 2019/07/16(火) 16:08:47.84 ID:cpfSTA9t >JavaScript, Python, Go, Ruby, : ["",";prop1:style1", ";prop2:style2"] 深くて理解できないことが多いが、これはやばい気がする http://mevius.5ch.net/test/read.cgi/tech/1489511075/881
882: デフォルトの名無しさん [sage] 2019/07/16(火) 17:23:30.54 ID:hAAouWtx 読んでるだけで何も考えてなかったけど /(^|[@;])[^@;]*/g この書き方以外の書き方で意図した動作になるように書けないのかな ここの人はこういうの得意だからもしかしたら・・? http://mevius.5ch.net/test/read.cgi/tech/1489511075/882
883: デフォルトの名無しさん [sage] 2019/07/16(火) 18:30:33.69 ID:AvaVqNzm 一所懸命挑発的に書いてるのに全然乗ってもらえなくてかわいそう http://mevius.5ch.net/test/read.cgi/tech/1489511075/883
884: デフォルトの名無しさん [sage] 2019/07/16(火) 19:27:45.24 ID:hAAouWtx 言ってることに説得力がありすぎて聞き入ってしまってたよ どんどん言いたいことを言って欲しい 昔のdanさんを思い出すなぁ http://mevius.5ch.net/test/read.cgi/tech/1489511075/884
885: デフォルトの名無しさん [sage] 2019/07/16(火) 20:41:55.62 ID:bFMew56o 入力フォーマットが正しいという前提で /@?[^@;]+/ の方が好み そもそも正規表現使うより ; でsplitした方が良くね?とおm http://mevius.5ch.net/test/read.cgi/tech/1489511075/885
886: デフォルトの名無しさん [sage] 2019/07/16(火) 21:03:17.33 ID:hMJFhr7R >>881 深くはない、単にバグってるだけ。 そしてそれはやばいどころではなく、全く話にならないレベルの物だ。使い物にならない。 例えば、図書館の蔵書をユーザーにも検索出来るようにしたとして、正規表現検索も選べるとしよう。 この場合、検索結果に現れないケースが発生することになり、使い物にならない。 プログラミング言語内の正規表現エンジンは「今までのプログラムが動かなくなる」危険があるからそうそう交換出来ないが、 図書館DBの検索フロントエ
ンド内のエンジンなんて即交換可能なんだから、問題があればすぐ乗り換えられる。 PCREが気に入らないのならこんなところで無駄吠えするのではなく、 PCREがバグっているケース(例のタグ外側マッチとか)でもばっちり動く検索エンジンを提供して、乗り換えを待てばいいだけ。 現状、PCRE以外全部バグっているのだから救いようがないが。 JavaScriptの場合はatomエディターなる物があって、htmlやプログラムソースコードを編集出来るが、 JavaScriptの場合はreplaceもバグっているので、命中すれば、全置換しても全置換出来てないケースが発生する。
リファクタ等で変数名を変えるとき、手でやるとバグるので、当然エディタ機能で全置換させるわけだが、この場合にもバグる訳だ。 そしてユーザーはこのときに置換漏れが発生するとは全く思わないので、かなり手間取ることになる。 (atomでは対策されていると信じたい) JavaScriptの場合はこのバグも「仕様」としてしまっているので、 逆に言えば仕様通りならバグに命中したときの挙動も確定してる。だから対策は出来るが、 Rubyみたいに「実装が仕様だ」と言い張る糞言語だとどういう挙動か確認してみなければ分からず、対策が出来ない。 ここらへん
もRubyの思想は数周遅れている。 いずれにしてもこんな基本的なところのバグはあっても迷惑でしかなく、さっさと直せ、でしかない。 「速い」以前に「ヒットしない」エンジンなんて使い物にならないだろ。 エンジン競争しているつもりの馬鹿共も、方向性を完全に間違ってる。 「間違いなく動作する」エンジンを提供すれば、文書検索側の人間はサクッと乗り換えてくれるだろうさ。 速い遅いはその後の話だ。 http://mevius.5ch.net/test/read.cgi/tech/1489511075/886
887: デフォルトの名無しさん [sage] 2019/07/16(火) 21:18:41.35 ID:hMJFhr7R >>879 BREの場合はやりきる前提ではないので、例えば例のタグ外側マッチだと、 元の文字列に > と < を足してしまって置換し、出力時に削る、みたいなことをする。 具体的には以下。 ('>' + str + '<').replace(/>[^<]*</,'>bar<').slice(1,-1) だからBREしか使えないAWKでも意外と何とかなったりする。 ただしこれはプログラミング出来る前提であって、 Webページに検索窓だけ提供されているような状態ではどうにもならないが。 &
gt;>885 それは正しい。実際俺もそれに近いことをしている。 デリミタが最初に出現もあり、最後に付加もあり、つまり ';prop:style1' や 'prop:style1;prop:style2;' もありなので、 結局 /(^|[@;])[^@;]*/g だと後のコードが綺麗に書けなかった。 /(^.|[@;])[^@;]*/g でも同じ。 意味的には @ もデリミタ扱いしているだけなので、実もフタもないが、@を ;@にしてsplitした。 具体的には以下。 str.replace(/@/g,';@').split(';').filter(v=>v) http://mevius.5ch.net/test/read.cgi/tech/1489511075/887
888: デフォルトの名無しさん [sage] 2019/07/16(火) 22:42:20.32 ID:P37s1FHo 一度言った内容は繰り返さなくていいです http://mevius.5ch.net/test/read.cgi/tech/1489511075/888
889: デフォルトの名無しさん [sage] 2019/07/17(水) 08:28:41.50 ID: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の筆者のケースでバグる。 その他バグケースも出してくれれば俺の推測で合っているかどうかは答える。 http://mevius.5ch.net/test/read.cgi/tech/1489511075/889
890: デフォルトの名無しさん [sage] 2019/07/17(水) 08:28:59.00 ID:2/Bgill9 正しい実装は、「経路全体」(つまりツリーのリーフ)に対してフラグを持たないといけない。 Perlは「区間」(=経路の一部)に対してフラグをつけてしまったところが間違いだ。 871のケース、単純化する為に (A0|A1)B(C0|C1)として、 1回目:A0BC1 で空文字マッチ そして空文字マッチの場合はこれを記録し、これと同一の場合は次回以降はスキップする。 結果、2回目:最初に A0BC1 がマッチするがこれは捨てられ、次に A1BC0またはA1BC1となる。 そして非空文字マッチとな
ったので、この記録を全破棄して、同様にループを繰り返せばいい。 実装の修正は、探索関数そのものにだいぶ手を入れないといけないのでそれなりに大変だ。 まずは全部の最終段に「最終チェック」を入れて上記リストと照合、記載有ればマッチ失敗として探索継続、としなければならないが、 おそらくこれが1ヶ所では済まない。 ただしこれはリターンパスを辿ればいいので何らかのツールが有ればほぼ自動でいけるかもしれない。 次に上記リストを作成する為に全経路を出力させなければならない。 デバッグ用にこれが既にあればラッキーだが、なければ自
前で作らなければいけない。 といっても内容はツリーのノードを辿るだけなので、ツリーのフォーマットが分かればすぐだが、 ゴリゴリに高速化とかしていると割と意味不明なコードになっていることが多いので、 その状態で確認するのは結構辛いとは思う。 リストの管理は、空文字マッチなら追記、非空文字マッチならクリア、なので、これはやるだけだ。 リストの管理も探索関数にやらせて、探索関数は 今:マッチ場所とマッチ長さを返す 修正後:マッチ場所とマッチ長さを含んだ『配列』を返す、とし、 「空文字マッチの場合は自動で継続、非空文字マッ
チまたは終了まで探索、まとめて配列で結果を返す」とするのがいいだろう。 http://mevius.5ch.net/test/read.cgi/tech/1489511075/890
891: デフォルトの名無しさん [sage] 2019/07/17(水) 08:29:16.56 ID:2/Bgill9 なおPerlの実装だと『上位関数のみ』で対策できるため、 「取り敢えず1時間で直せ」と言われたらこうなるのも分からなくはない。 しかしいまだにそのままだというのは怠慢でしかないが。 JavaScript等も同様、『上位関数のみ』で対策出来るところで留まっている点からも、これは言える。 しかし現時点で世界中のプログラマがどれだけ無駄な時間を消費することになっているのかを考えれば、 こんなのは手間であろうがさっさと直せ、でしかないが。 いずれにしても、俺が
修正してやる、修正案はこれだ!と具体的に出してくるのならレビューはする。 我こそは!という奴は頑張れ。 http://mevius.5ch.net/test/read.cgi/tech/1489511075/891
892: デフォルトの名無しさん [] 2019/07/17(水) 09:46:24.93 ID:u050lnGw 話を単純化すると、 1. ある文字、例えば@ から、次の@ の直前の文字まで 2. 先頭が、@ でなければ、先頭から、@ の直前の文字まで。 つまり、先頭が、@ でなければ、先頭文字を、@ とみなして処理する つまり、ルール1・2は、同時に適用させず、先にルール1を適用し、 ルール1に適用しないものだけを、ルール2に使う (^|[@;])[^@;]* だから、この正規表現がおかしい。 定義があいまいになる、解釈を含んでいる! OR の部分が、並列ではない。 ルール1を優先すべき! ht
tp://mevius.5ch.net/test/read.cgi/tech/1489511075/892
893: 892 [sage] 2019/07/17(水) 09:51:38.77 ID:u050lnGw (^|[@;])[^@;]* OR を使うと、両方に該当する場合に、どちらの処理がされるのか、あいまい! つまり、先頭文字が@; の場合に、両方に該当するので、処理があいまい! A|B A, B 両方に該当する場合に、A,B どちらの処理がされるのか、あいまい! http://mevius.5ch.net/test/read.cgi/tech/1489511075/893
894: デフォルトの名無しさん [sage] 2019/07/17(水) 09:53:34.46 ID:RL7WDafS 左側優先とかないのかこれ? http://mevius.5ch.net/test/read.cgi/tech/1489511075/894
895: 877 [sage] 2019/07/17(水) 10:06:18.04 ID: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 = s
tr.scan( re_2 ) # [["@time", "@"], [";prop1:style1", ";"], [";prop2:style2", ";"]] http://mevius.5ch.net/test/read.cgi/tech/1489511075/895
896: デフォルトの名無しさん [] 2019/07/17(水) 13:38:56.68 ID:FD/sfaX1 小飼って糖尿病で死んだんだっけ http://mevius.5ch.net/test/read.cgi/tech/1489511075/896
897: デフォルトの名無しさん [] 2019/07/17(水) 14:01:11.32 ID:fOq5lc1d 質問させてください。 PCRE や bregonig で大文字・小文字の区別なしで\x{017F}がsやSにマッチしてしまうのは仕様ですか? http://mevius.5ch.net/test/read.cgi/tech/1489511075/897
898: デフォルトの名無しさん [sage] 2019/07/17(水) 15:07:35.98 ID:Jmalh7Yl >>887 >('>' + str + '<').replace(/>[^<]*</,'>bar<').slice(1,-1) おぉ、perlの正規表現なら正規表現だけで大抵のことは出来るから 自分には前処理をするという発想がなかった、目からうろこでした 今回のケースもこの方法でデータの前後に ; を付ければ簡単になりましたね >>897 \w が あ にマッチするくらいなので仕様なのでは オプションでマッチしなくしたり出来るのでオプションのヘルプを見ましょう http://mevius.5
ch.net/test/read.cgi/tech/1489511075/898
899: デフォルトの名無しさん [sage] 2019/07/17(水) 20:30:56.60 ID:2/Bgill9 >>894 ないね。 聞いたこと無いし、JavaScriptで試した限り ([@;]|^)[^@;]* でも結果は同じだった。 ただ、確かに普通に考えたら左優先でいいし、上記入れ替えで @time をキャプチャ出来るようになるべきではある。 言われてみれば優先順位が決まってないことに驚きだ。 http://mevius.5ch.net/test/read.cgi/tech/1489511075/899
900: デフォルトの名無しさん [sage] 2019/07/17(水) 20:37:09.24 ID:RL7WDafS >>899 ちょっと知識が深まったよ サンクス http://mevius.5ch.net/test/read.cgi/tech/1489511075/900
901: デフォルトの名無しさん [sage] 2019/07/17(水) 20:40:11.08 ID:2/Bgill9 >>895 お前は毎回Rubyの話をどのスレにも持ち込んでいる荒らしだろ。 何か言いたいことがあるのなら必ず結論を書け。 何が言いたいのか分からないのでウザイ。だから荒らしなんだよ。 + に変えて空文字マッチをなくし、結果、希望の文字列を得る、という運用で回避するのはありだ。 ただ、その場合は、プログラマにそう分かるように、 「Rubyの正規表現エンジンは空文字マッチ周りにバグがあるので、注意してください。 空文字マッチがある正規表現を与えた場合
、予期せぬ動作になることがあります。」とアナウンスしないといけない。 事実上空文字マッチが使えないが、事実なんだからそうするしかないだろ。 Rubyはこういう事を全くしないからゴミなんだよ。Rubyは滅ぶべくして滅んで行ってるだけ。 JavaScriptは少なくとも仕様に明記はしてる。 ただそれだと弱いからMDNにも書け、というのが俺の主張であり、JavaScriptスレに勝手に依頼しておいた。 以前RegExp.testの件で同様に依頼したら追記されたから、そうなるのを願っている。 そういう、「落とし穴」は共同して塞いでいかないと駄目なんだよ。 完璧な
言語なんてない。だから多少バグがあるのは仕方ないとして、 それを未来永劫新規プログラマに押しつけて「キャハハー、お前も落ちたか!」なんてやっているようでは駄目なんだ。 Rubyはプログラマに対してリスペクトが全くない。だから廃れるし、俺もそうなることを願っている。 お前はRubyを吹聴しさえすれば布教出来ると勘違いしているようだが、そんなことはない。 当たり前だが新人にとってはこんなバグにつき合わされること自体大迷惑でしかないんだよ。 今回のでもPCREが一番ましだし、Rubyなんて選ばれる理由がないだろ。 ゴミだと分かっている
ものを広めるのは、単なる詐欺師でしかないぞ。 お前はお前の行為によってRubyへの反感を得ているだけなことを自覚した方がいい。 あちこちのスレでお前は相当ウザがられてる。 そういうのではなくて、バグを修正するとか、仕様書に明記するとか、 何でそういう建設的な方向に努力出来ないんだ? こういう地道な積み重ねを全くやってないからRubyの現状はあるわけでさ。 http://mevius.5ch.net/test/read.cgi/tech/1489511075/901
902: デフォルトの名無しさん [sage] 2019/07/18(木) 16:11:19.79 ID:Y8yxmCyC 今の複雑化した正規表現エンジンってエンジンを作った人ですらどう動くのか 予測が難しいところがあるのでは バグと言えばバグだけど総合的に考えてみてこの動作が最適だからこのままにしよう という部分もたくさんあると思う だから怠慢という言葉はちょっと違う気がするなぁ あとrubyの正規表現エンジンは空文字マッチが〜の件は つまりonigmoのことを言ってるんだけどonigmo自体は空文字マッチに 対応してると記憶してるからrubyモードの仕様なんじゃないかな
http://mevius.5ch.net/test/read.cgi/tech/1489511075/902
903: デフォルトの名無しさん [sage] 2019/07/18(木) 20:03:10.71 ID:PnG1z3PK >>902 Ruby周りにはお前みたいなクズしかいないから駄目なんだよ。 プログラミング出来ないのなら黙ってろ。 今のお前が為すべきは、お前が持っているonigmo環境で該当パターンを試し、結果を共有することだ。 Rubyの評判を気にすることではない。 Ruby+onigmoの組み合わせでばっちり動くのなら、 「他環境はゴミです!みなさんの悩みはRubyで解決出来ます!この機会に乗り換えてください!」と言えばいいだけだ。 動くんじゃないかな、みたいなお前の希望的観測
なんて何の役にも立たない。 或いは、onigmo単独では動くがRubyのバグ互換モードでは動かない、というのが事実なら、 「Rubyは次のメジャーアップデートでここが対策されます!みなさんご期待ください!」 と言えばいいだけだ。 実際、正規表現の方言/バグに参っている連中はいるんだから、それで乗り換えてくれるだろうさ。 実際、Rubyの奴らはこういう事を全くしない。 そしてRubyの評判だけを気にしているからRubyはゴミのままなんだよ。 871の件、Perl5.6だがPCREもか?と思って試したが、PCREもだ。 そしてPCREには > using the same synt
ax 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界隈にはまともなプログラマがいないからだよ。 http://mevius.5ch.net/test/read.cgi/tech/1489511075/903
904: デフォルトの名無しさん [sage] 2019/07/18(木) 20:22:20.04 ID:Y8yxmCyC BREという超シンプルな正規表現エンジンが持っていた明解な動作の分かりやすさを 現代の超複雑な正規表現エンジンに求めることには無理がある ちょっと挙動が変なところがあるけどこのほうが便利だよねってのが現代の考え方 なんじゃないかな、それに適応してるのが現代のプログラマということだろう ゼロ幅マッチで1歩進む件もそういう挙動にするメリットがあるから そうしてるんだろう、どんなメリットなのかは分からないが コスト的な問題やセキュリティ的な問題か
も知れない 時代遅れのプログラマが何を言おうが正直興味ないわ 現代の正規表現で見れば初心者だし 初心者が内部動作の仮説を立てたところで当たるわけがない しかもたった数例のコードの動作を見ただけでだ、あほらしい http://mevius.5ch.net/test/read.cgi/tech/1489511075/904
905: デフォルトの名無しさん [sage] 2019/07/18(木) 20:44:40.06 ID:PnG1z3PK >>902 お前みたいなゴミに回答する意味はないが、一応つけておいてやる。 > 今の複雑化した正規表現エンジンってエンジンを作った人ですらどう動くのか > 予測が難しいところがあるのでは そんなわけあるか馬鹿タレ。 今現在もスクリプタはプログラマからすると一段下に見られてて、 「スクリプタをプログラマと呼ぶな」という奴も一定数居るだろ。 その理由がこれだよ。 ガチのプログラマは数年前に他人が記述したコードでも必要あれば修正するしかない。
だからこの為に多大なる手間をかけてコードを整備してる。 スクリプタがやってる、今書いて今動いたら捨てておk、なんて甘い世界ではない。 まともなコードなら未来永劫整備可能だし、また、それを目指しているのがプログラマだ。 実際、Linuxなんて30年越しで整備され続けてるだろ。 数年前にお前が書いたコードすら読めないのは、お前の問題であって、それを全体のように言うな。 だからスクリプタは馬鹿にされるし、嫌われるんだよ。 正規表現エンジンなんてプログラミング全体からするとかなり簡単な部類だ。 動けばいいだけのエンジンなら再帰
しまくりで1000行程度だろう。 最悪全交換でいい規模だから、そこまでガチで整備されている事は期待出来ないが、 それにしてもこの程度の規模のプログラムを読めない、ってことはあり得ない。 高速化はプログラムに対して「複雑度」を増すものではない。 具体的に言うと、静的コールグラフを複雑化することはなく、 単に遅い関数を速い関数に入れ替える、というのが基本になる。 だから、正規表現エンジンを読めない、というのなら、書いた奴か読む奴が馬鹿なだけであって、 ちゃんとした奴が書いたエンジンをちゃんとした奴が読めば確実に読める。 h
ttp://mevius.5ch.net/test/read.cgi/tech/1489511075/905
906: デフォルトの名無しさん [sage] 2019/07/18(木) 20:46:26.35 ID:PnG1z3PK > バグと言えばバグだけど 単なるバグだ馬鹿タレ。 > 総合的に考えてみてこの動作が最適だからこのままにしようという部分もたくさんあると思う 非互換になるのでどこでアップデートして修正するかは言語側の選択となる。 だからその前段階、つまり今どこにバグがあってどれくらい問題なのか把握し、 それを広報して共有し、どのタイミングで修正するかを話し合わないといけない。 Rubyはこれが全く出来てない。だからゴミのままなんだよ。 > だから怠慢という
言葉はちょっと違う気がするなぁ バグだと認識した上で、それを仕様として広報するのが最低の義務。 JavaScriptとPerlはそれをやっている。 Rubyの現状はバグに気づいてないか、敢えて黙っているかで、どちらにしても糞でしかない。 > つまりonigmoのことを言ってるんだけどonigmo自体は空文字マッチに > 対応してると記憶してるから お前がどんだけ馬鹿なのか分からないが、「バグ」ってのは意図してない動作のことを言うんだぞ。 つまり、対応してるつもりが対応できてないから「バグ」なんだよ。 > rubyモードの仕様なんじゃないかな そ
う言うのはちゃんと調べてから言え。希望的観測ではミスリードを大量発生させる。 そしてこれをやりまくっているのがJavaScript界隈で、結果、JavaScripterは馬鹿が再生産されまくってる。 そういうのは止めろ。お互いに得る物がない。 >>904 まあ書いた後に読んだから投稿はしておいた。 話すつもりがないのならさようならでいい。 お前は、自身の問題を認識出来てないタイプだ。まあこのタイプもよくいるが。 http://mevius.5ch.net/test/read.cgi/tech/1489511075/906
907: デフォルトの名無しさん [sage] 2019/07/18(木) 21:56:03.46 ID:xdHI+pcE 荒らしと会話するな! 荒らしと会話する者も、荒らしだぞ! プログラマーとは、コードで語る者だけ! 能書きはいらない! そいつらは荒らしだから、会話するな! http://mevius.5ch.net/test/read.cgi/tech/1489511075/907
908: デフォルトの名無しさん [sage] 2019/07/18(木) 22:31:51.56 ID:PnG1z3PK >>907 お前はコードだけで語りすぎだけどな。 結論を書くようにしろよ。 というかRuby界隈の問題は典型的にこれなんだよ。 Rubyの連中と話してても話が前に進まない。 俺が老害プログラマで荒らしだったとして、 それはRubyの為にも、またこのスレを読んでいる連中の知識になるものでもないだろ。 Rubyの連中は精神年齢がちっと低すぎる。 onigumoが該当パターンに対して正しい答えを出せるのなら喧伝すればいいし、 駄目なら今現在正しく返せるPCRE以下だとい
う現実を受け入れるしかない。 どっちでもないってのは、俺には頭おかしいとしか思えないけどな。 まあ確実に言えるのは、Rubyを今から学ぶのは止めとけ、ってことだ。 Rubyはコミュニティの腐り方がどうも他とは違う。 (JavaScriptも腐ってはいるが、あれは「若すぎる」のが原因だ。 かといって放置しても自然に改善するものでもないが) http://mevius.5ch.net/test/read.cgi/tech/1489511075/908
909: デフォルトの名無しさん [sage] 2019/07/19(金) 00:09:18.78 ID:KcCrOwH9 PCREに非包含オペレータが搭載されたら起こしてくれ http://mevius.5ch.net/test/read.cgi/tech/1489511075/909
910: デフォルトの名無しさん [sage] 2019/07/19(金) 00:50:19.02 ID:CNkXpMDT >>909 というかお前もそうだが、onigmo使ってるなら何で試して動作報告してくれないんだ? そういうところがRubyのコミュニティはおかしいんだよ。 「みんなで前に進む」という感覚がない。 ちなみに > 鬼車の中の人と Ruby の間の確執がなければとっくの昔に実装されていたのだろうかと思ったり思わなかったり。 > https://qiita.com/k-takata/items/4e45121081c83d3d5bfd これって何?知ってたら教えてくれれば助かる。 http://mevius.5ch.net/test/read
.cgi/tech/1489511075/910
911: デフォルトの名無しさん [sage] 2019/07/19(金) 02:29:00.41 ID:CNkXpMDT >>909 入る予定なんてないだろう。 > 8.2 Perl > Perl には最短一致の繰り返し、バックトラック > の抑制、否定先読みがある。これにより、非包含オ > ペレータに似た効果を得ることができる。しかし、 > 7.2 節で詳しく述べたようにこれらは形式言語理論 > からすると適切に扱えず、正規表現の組合せなどに > 問題が生じる。 > https://staff.aist.go.jp/tanaka-akira/pub/prosym49-akr-paper.pdf つまり理論畑の人には問題があるが、プ
ログラミング上問題はないんだろ。 そりゃ入れないだろ。 http://mevius.5ch.net/test/read.cgi/tech/1489511075/911
912: デフォルトの名無しさん [sage] 2019/07/19(金) 03:16:00.34 ID:CNkXpMDT >>910 自己レスだがだいたい分かった。 その他はリンク切れが多くて詳細までは追えないが、どうやら、勝手に使ったことに対して怒っているらしい。 https://kkos.hatenadiary.org/entries/2007/05/25#1180100250 が、ライセンス違反でなければ勝手に使え、というのがBSDだし、 告知しなかったことに関してはRuby側が悪いわけでもない気がするが。 ただこれなら鬼車にはRubyバグを作り込む必要がないから芽がある気はする。 そして文句を言ったところで鬼雲にフォ
ークしてマージしたのなら実質大して変わらない気もする。 よく分からん所で喧嘩してるなとは思う。 http://mevius.5ch.net/test/read.cgi/tech/1489511075/912
913: デフォルトの名無しさん [sage] 2019/07/19(金) 11:33:59.54 ID:bgAzEf51 このスレでコミュニティうんぬんは脱線しすぎじゃないかい。スレタイとなんも関係ないやろ。 http://mevius.5ch.net/test/read.cgi/tech/1489511075/913
914: デフォルトの名無しさん [sage] 2019/07/20(土) 15:46:35.52 ID:KXtQuYxh 本当にプログラマなのかな http://mevius.5ch.net/test/read.cgi/tech/1489511075/914
915: デフォルトの名無しさん [sage] 2019/07/20(土) 17:29:27.69 ID:AFOF1ubv JSです 「はい」「はい」 「うん」「うん」 「■●」「■●」 「△◎」「△◎」 など、同じ文字列2回(あるいは2回以上)の繰り返しを探すにはどうすればよいでしょうか? /「(.+)+」/ とかだと、1回目と2回目が違ってもヒットしちゃいますよね…? http://mevius.5ch.net/test/read.cgi/tech/1489511075/915
916: 915 [sage] 2019/07/20(土) 17:31:58.05 ID:AFOF1ubv >>915 例を全部2文字にしちゃいましたが、 .+ と書いているとおり別に文字数は関係ありません http://mevius.5ch.net/test/read.cgi/tech/1489511075/916
917: 915 [sage] 2019/07/20(土) 17:37:46.94 ID:AFOF1ubv >>915 そして度々すみませんが /「(.+)+」/ じゃなくて /「(.+)」+/ でした とりあえずこれはダメな例ということで いい例が知りたいです http://mevius.5ch.net/test/read.cgi/tech/1489511075/917
918: デフォルトの名無しさん [sage] 2019/07/20(土) 17:45:51.81 ID:kkJ7q95a >>915-916 https://qiita.com/y-ken/items/7d5bf086be68d23e1318 http://mevius.5ch.net/test/read.cgi/tech/1489511075/918
919: デフォルトの名無しさん [sage] 2019/07/20(土) 20:12:32.11 ID:AFOF1ubv >>918 3つ目の # 重複文字列の抽出にも応用できます pry(main)> '東京都日野市日野市ほげほげ'.match(/(.+)(\1)/) => #<MatchData "日野市日野市" 1:"日野市" 2:"日野市"> ですね、ありがとうございます…! http://mevius.5ch.net/test/read.cgi/tech/1489511075/919
920: デフォルトの名無しさん [sage] 2019/07/21(日) 20:31:55.31 ID:Bdf0kkIf >>912 ttps://kkos.hatenadiary.org/entry/20070906/1189084566 松本氏はrb_enc_mbclen()のインターフェースが不適切であるという指摘に対して、何故、その原因を私に責任転嫁したのでしょうか? rb_enc_mbclen()のインターフェースが不適切になっている本当の理由は何でしょうか? まつもと 元の表現は「鬼車から継承した」と書いただけで、別に「鬼車に責任がある」というつもりはありませんでした(実際「責任」はないわけですし)。 現在のインタフェースに
なっている原因が「鬼車がそうなっていたから」であり、その理由は「まつもとがGB18030のようなエンコーディングへの対応に対する関心が薄かった」ということです。 「だったら、最初からそう書けよ」と言われそうですが、すいません、言葉が足りませんでした。 http://mevius.5ch.net/test/read.cgi/tech/1489511075/920
921: デフォルトの名無しさん [sage] 2019/07/22(月) 01:27:11.95 ID: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氏の判断は妥当だ。 http://mevius.5ch.net/test/read.cgi/tech/1489511075/921
922: デフォルトの名無しさん [sage] 2019/08/01(木) 15:57:12.21 ID:BVNOJ7mG >>789やってくれる人はいないか〜 2ch全盛期なら誰かしらやってくれた可能性高いけどすっかり寂れたな onigmoに興味があるならtakata氏の日記を読破してみてはどうかな 作りながら考えてたことが分かって面白かったよ http://mevius.5ch.net/test/read.cgi/tech/1489511075/922
923: デフォルトの名無しさん [sage] 2019/08/24(土) 12:41:17.80 ID:fR0bFJ1E perlで (?<=(aa|bb))c ならokだが (?<=(aa|bbb))c だとVariable length lookbehind not implementedになるの納得いかないなー 確かに戻り読み部分の長さに複数の可能性があるけど明らかに有限じゃん 秀丸のHmJre.dllだと通るようだ http://mevius.5ch.net/test/read.cgi/tech/1489511075/923
924: デフォルトの名無しさん [] 2019/08/24(土) 13:46:10.60 ID:6nD2xE5w (?<=(aa.*|bbb))c http://mevius.5ch.net/test/read.cgi/tech/1489511075/924
925: デフォルトの名無しさん [sage] 2019/08/25(日) 15:17:23.04 ID:GRZE+Rz9 (?<=aa|bbb)c http://mevius.5ch.net/test/read.cgi/tech/1489511075/925
926: デフォルトの名無しさん [sage] 2019/09/01(日) 12:33:19.59 ID:fodjUzDJ JS(ES2017)です 「貫樣」みたいな、中国語でしか使われないような怪しい漢字を弾きたい (日本語で使われる漢字のみ許可したい この場合は「貫」だけ残して「樣」は消したい) のですが CJKとか言って一緒くたになっている以上、Unicode範囲指定などで判別することはできないですかね…? http://mevius.5ch.net/test/read.cgi/tech/1489511075/926
927: 926 [sage] 2019/09/01(日) 12:38:35.03 ID:fodjUzDJ 「樣」は一応日本語でも使うみたいですね… とりあえず常用漢字じゃなければ弾くくらいでもいいのですが 常用漢字表を作って比較するくらいしかない…のかな? http://mevius.5ch.net/test/read.cgi/tech/1489511075/927
928: デフォルトの名無しさん [] 2019/09/01(日) 13:31:25.10 ID:kCJZVLuH http://www.shuiren.org/chuden/teach/code/main8.htm http://mevius.5ch.net/test/read.cgi/tech/1489511075/928
929: デフォルトの名無しさん [] 2019/09/01(日) 13:35:35.35 ID:kCJZVLuH ねむい http://kanji.zinbun.kyoto-u.ac.jp/~yasuoka/CJK/gb2312-80.gif http://kanji.zinbun.kyoto-u.ac.jp/~yasuoka/index-j.html http://mevius.5ch.net/test/read.cgi/tech/1489511075/929
930: デフォルトの名無しさん [sage] 2019/09/01(日) 18:46:39.31 ID: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で保存したら他は 疑問符になるだろうからそれをまとめて削除したらおしまいだろうが 繁体字の樣は残る。簡体字の[木羊]は消える。 http://mevius.5ch.net/test/read.cgi/tech/1489511075/930
931: デフォルトの名無しさん [] 2019/09/01(日) 21:04:09.80 ID:fO6VcsLE Google謹製の正規表現ライブリ「re2」でググったら「バイオハザード2 RE:2」が検索上位に来るのどうにかならない? http://mevius.5ch.net/test/read.cgi/tech/1489511075/931
932: デフォルトの名無しさん [sage] 2019/09/01(日) 22:01:25.54 ID:Zrnas7uJ >>931 s/^(.+)でググったら「バイオハザード2 RE:2」が検索上位に来るのどうにかならない?$/$1/ http://mevius.5ch.net/test/read.cgi/tech/1489511075/932
933: デフォルトの名無しさん [sage] 2019/09/01(日) 22:50:02.12 ID:8GDP8quV RE2 regex とか RE2 正規表現 とかでググれば http://mevius.5ch.net/test/read.cgi/tech/1489511075/933
934: デフォルトの名無しさん [sage] 2019/09/10(火) 22:48:57.92 ID:CokwQGf+ 直前の文字が1回以上出現することが確実なケースで、仮に0回の出現として考慮しても問題がないという場合に、 +ではなく*で正規表現を記述する理由はありますか? 例えば、慣例として*のほうを使うとか、*とするとマッチしない場合のみ+を使うとかそういう http://mevius.5ch.net/test/read.cgi/tech/1489511075/934
935: デフォルトの名無しさん [sage] 2019/09/10(火) 23:21:08.02 ID:1dbF51qB 0回も許容するなら+ではなく*にする理由は0回も許容するからとしか http://mevius.5ch.net/test/read.cgi/tech/1489511075/935
936: デフォルトの名無しさん [sage] 2019/09/10(火) 23:26:41.78 ID:L5QX1JAH 具体例で示してくれんとなんか曖昧でよくわからんね http://mevius.5ch.net/test/read.cgi/tech/1489511075/936
937: デフォルトの名無しさん [] 2019/09/11(水) 12:05:55.89 ID:zFEVPQj4 >1回以上出現することが確実なケース >仮に0回の出現として考慮しても問題がない 矛盾してるな http://mevius.5ch.net/test/read.cgi/tech/1489511075/937
938: デフォルトの名無しさん [sage] 2019/09/11(水) 15:12:05.49 ID:wb8QVF41 >>934 出現が確実ではあるが、もしなかった場合にも対応したい そういう要求があり、動作にも差し支えない場合なら * をつかう ということに尽きるでは? http://mevius.5ch.net/test/read.cgi/tech/1489511075/938
939: デフォルトの名無しさん [sage] 2019/09/11(水) 16:12:55.15 ID:h8Pfy2ne >>762 http://mevius.5ch.net/test/read.cgi/tech/1489511075/939
940: デフォルトの名無しさん [sage] 2019/09/12(木) 02:26:26.53 ID:xpiKRNxb やっぱ質問して放置か、教える側も学習すべきだな まともな質問じゃないと思ったらスルーでいい http://mevius.5ch.net/test/read.cgi/tech/1489511075/940
941: デフォルトの名無しさん [sage] 2019/09/12(木) 04:33:29.68 ID:+6m2JHnd 別におかしな質問じゃないだろ http://mevius.5ch.net/test/read.cgi/tech/1489511075/941
942: デフォルトの名無しさん [sage] 2019/09/12(木) 06:58:37.97 ID:1ik9S0iw いや普通におかしいだろ なんか無理矢理の条件考えて論争させようとしてるような気がする http://mevius.5ch.net/test/read.cgi/tech/1489511075/942
943: デフォルトの名無しさん [sage] 2019/09/12(木) 08:21:20.40 ID:xpiKRNxb 自分なら人にこういう質問レスを書くかなって考えてみて絶対書かないと 思うものにはレス付けないのがいいかもね 説明不足で意味不明なものとかも http://mevius.5ch.net/test/read.cgi/tech/1489511075/943
944: デフォルトの名無しさん [sage] 2019/09/12(木) 09:22:01.93 ID: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,}"で検索は出来たのですが置換が思い浮かびません http:/
/mevius.5ch.net/test/read.cgi/tech/1489511075/944
945: デフォルトの名無しさん [sage] 2019/09/12(木) 10:00:21.41 ID:bJPykHLq わかりやすいように、できるだけそのまま書くならこうかな ●検索文字列 (id="|\G )((\d+[A-Z]\d+))[a-z] ●置換文字列 \1\2 http://mevius.5ch.net/test/read.cgi/tech/1489511075/945
946: デフォルトの名無しさん [sage] 2019/09/12(木) 10:04:35.65 ID:bJPykHLq 置換に問題は無いけど()が二重になってたミス修正 (id="|\G )(\d+[A-Z]\d+)[a-z] http://mevius.5ch.net/test/read.cgi/tech/1489511075/946
947: デフォルトの名無しさん [sage] 2019/09/12(木) 10:30:50.86 ID:TOasMGF3 >946 出来ました! ありがとうございます。 田中哲スペシャルっていうやり方なのでしょうか http://mevius.5ch.net/test/read.cgi/tech/1489511075/947
948: デフォルトの名無しさん [sage] 2019/09/12(木) 11:08:37.62 ID:bJPykHLq \Gは照合開始位置と呼ばれる物で、マッチした箇所の後の境界にマッチしてくれるので さっきのように(特定の文字列or前回置換しところ)の後に置換したい文字列があるときとかに便利で定番 田中哲スペシャルは\gで同じ表現をもう一回使うって奴だから違うかな http://mevius.5ch.net/test/read.cgi/tech/1489511075/948
949: デフォルトの名無しさん [sage] 2019/09/12(木) 11:58:31.87 ID:TOasMGF3 >948 勉強になります。 ちなみに最初の値にはアルファベットがついてないケースだと拾えなかったのですが id="97B22 95D18a 93B22c 93E23b" 対応策ありますでしょうか? http://mevius.5ch.net/test/read.cgi/tech/1489511075/949
950: デフォルトの名無しさん [sage] 2019/09/12(木) 12:04:38.94 ID:xpiKRNxb 自分ならこの時点でスルー \Gは文頭にもマッチするから誤爆対策を忘れずに http://mevius.5ch.net/test/read.cgi/tech/1489511075/950
951: デフォルトの名無しさん [sage] 2019/09/12(木) 15:04:33.55 ID:bJPykHLq >>949 自分でも書けない訳じゃないみたいだし、魚を与えるより釣り方を教えよの精神でヒント 変更のない置換後でも\Gは引っかかるので、小文字がないidも全部マッチするようにすれば こういうのを後出しされるとお互い二度手間だから 質問するときはパターンを網羅的に書いといた方が良いよ あと>>950が指摘してくれたように誤爆が懸念されるので、\Gを\G(?<=.)にした方が良いかもしれない ●対象データが正確で、実際の対象もidのみが載ったリスト形式
みたいなものなら要らないけど http://mevius.5ch.net/test/read.cgi/tech/1489511075/951
952: デフォルトの名無しさん [sage] 2019/09/12(木) 18:04:49.29 ID:TOasMGF3 >951 ヒントありがとうございます。 残りは自分でがんばってみます。 http://mevius.5ch.net/test/read.cgi/tech/1489511075/952
953: デフォルトの名無しさん [] 2019/09/12(木) 18:08:37.95 ID:EfYu2rO4 文字列 "プログラマー" を "プロクライマー" に書き換える正規表現を教えて下さい http://mevius.5ch.net/test/read.cgi/tech/1489511075/953
954: デフォルトの名無しさん [sage] 2019/09/12(木) 21:50:17.55 ID:Jdu1U3XN そこにソースがあるから登るんだ。 http://mevius.5ch.net/test/read.cgi/tech/1489511075/954
955: デフォルトの名無しさん [] 2019/09/12(木) 22:19:07.70 ID:cqw0/uFd 正規表現の使い方じゃなく作り方、バックトラックなど理論から解説している書籍やそれに準ずるサイトなど知っていたらご教示ください。 こうやればこうなるよ、こういうときはこうすればいいんだよ的な学習では身に付かなくて… http://mevius.5ch.net/test/read.cgi/tech/1489511075/955
956: デフォルトの名無しさん [sage] 2019/09/12(木) 22:56:30.12 ID:Yy9Clfy1 自分が参考にしたのはここだったかな http://fussy.web.fc2.com/algo/search5_regex.htm 実装の仕方がある程度分かれば鬼車の作者さんのブログ(rubyの一件以前の記事)も参考になると思う http://mevius.5ch.net/test/read.cgi/tech/1489511075/956
957: デフォルトの名無しさん [] 2019/09/12(木) 23:14:33.93 ID:Uy9QyXie ありがとうございます! rubyの一件って何ですか?(何て検索したらいいですか?) http://mevius.5ch.net/test/read.cgi/tech/1489511075/957
958: デフォルトの名無しさん [sage] 2019/09/12(木) 23:43:24.49 ID:Yy9Clfy1 Rubyの作者さんと何かあったようで嫌気が差したのかそれ以後ブログで正規表現のことを 取り上げる頻度がめっきり減っちゃったんですよ http://mevius.5ch.net/test/read.cgi/tech/1489511075/958
959: デフォルトの名無しさん [] 2019/09/13(金) 08:32:54.25 ID:sQZEDK+j >>958 ありがとうございます! なるほど、残念ですね… http://mevius.5ch.net/test/read.cgi/tech/1489511075/959
960: デフォルトの名無しさん [] 2019/09/13(金) 10:47:34.78 ID:wKEqF87n 955 https://codezine.jp/article/detail/3158 https://tociyuki.hatenablog.jp/entry/20070222/1172158021 http://hellocode.jugem.jp/?eid=748 http://mevius.5ch.net/test/read.cgi/tech/1489511075/960
961: デフォルトの名無しさん [sage] 2019/09/13(金) 11:54:40.09 ID:X5DxpBbM 正規表現はどの言語でも共通で使えますか?それともちょっと違ったりしますか? http://mevius.5ch.net/test/read.cgi/tech/1489511075/961
962: デフォルトの名無しさん [sage] 2019/09/13(金) 12:02:22.73 ID:KuW4wLhZ ちょっと違ったりします http://mevius.5ch.net/test/read.cgi/tech/1489511075/962
963: デフォルトの名無しさん [sage] 2019/09/13(金) 13:25:46.31 ID: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" http://mevius.5ch.net/test/read.cgi/tech/1489511075/963
964: 963 [sage] 2019/09/13(金) 13:43:10.59 ID:8XwQqyT8 >>963 修正 >ただし、同じ行に、id="〜" が複数あると、バグる! 大丈夫だった。正常に動く http://mevius.5ch.net/test/read.cgi/tech/1489511075/964
965: デフォルトの名無しさん [sage] 2019/09/16(月) 02:45:59.31 ID: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"] になってしまい、数字のあとの余計な半角
スペースをあとで取り除かなければならなくなるのがなんか嫌で… http://mevius.5ch.net/test/read.cgi/tech/1489511075/965
966: デフォルトの名無しさん [sage] 2019/09/16(月) 02:59:29.74 ID:/xGIA7r1 正規表現を使えないなら文字列操作でやればいいだけ 正規表現を使いこなせてない人が使うとバグの温床になるからお勧めしない http://mevius.5ch.net/test/read.cgi/tech/1489511075/966
967: デフォルトの名無しさん [sage] 2019/09/16(月) 07:18:26.85 ID:m2l8x1P1 >>965 .split(' ', 2) http://mevius.5ch.net/test/read.cgi/tech/1489511075/967
968: デフォルトの名無しさん [] 2019/09/16(月) 12:07:55.69 ID: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"]] http://mevius.5ch.net/test/read.cgi/tech/1489511075/968
969: デフォルトの名無しさん [sage] 2019/09/16(月) 15:25:40.41 ID:YU5GpdCi JSでは、 ["30", "8 year old humans"] ではなく ["30","8"] となる limitは、分割結果の制限であり、見つかった要素の数をそこまでで打ち切る http://mevius.5ch.net/test/read.cgi/tech/1489511075/969
970: 968 [sage] 2019/09/16(月) 15:36:25.96 ID:oN5KVYJd >969 えー!! http://mevius.5ch.net/test/read.cgi/tech/1489511075/970
971: デフォルトの名無しさん [sage] 2019/09/16(月) 15:52:31.08 ID:YU5GpdCi >>970 https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/String/split#Returning_a_limited_number_of_splits http://mevius.5ch.net/test/read.cgi/tech/1489511075/971
972: デフォルトの名無しさん [sage] 2019/09/16(月) 16:04:28.98 ID:2suJbq8i matchじゃなくてsplitで str.split(/(?<=^\d+) /) か array = str.split(" "); array[0] + array.slice(1).join(" ") とかじゃない? http://mevius.5ch.net/test/read.cgi/tech/1489511075/972
973: デフォルトの名無しさん [sage] 2019/09/16(月) 16:06:13.84 ID:2suJbq8i 間違えた 下の最後こうか [array[0], array.slice(1).join(" ")] http://mevius.5ch.net/test/read.cgi/tech/1489511075/973
974: デフォルトの名無しさん [sage] 2019/09/16(月) 16:24:50.88 ID:VWND3fAL 素直に "30 8 years old".match(/^(\d+) (.*)$/).slice(1) じゃいかんの? http://mevius.5ch.net/test/read.cgi/tech/1489511075/974
975: デフォルトの名無しさん [] 2019/09/16(月) 16:28:11.45 ID:53ZoYsUm 正規表現逆引きcgiとかないの? 雑に日本語で書き込んだらAIが判断して正規表現を返してくれる そんなの http://mevius.5ch.net/test/read.cgi/tech/1489511075/975
976: デフォルトの名無しさん [sage] 2019/09/16(月) 17:07:19.10 ID:YU5GpdCi >>974 マッチしない場合でもエラーにならないよう保険かけとく方がよいのでは? (str.match(/〜/)||[]).slice(1) http://mevius.5ch.net/test/read.cgi/tech/1489511075/976
977: デフォルトの名無しさん [sage] 2019/09/16(月) 17:20:26.44 ID: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' ] http://mevius.5ch.net/test/read.cgi/tech/1489511075/977
978: デフォルトの名無しさん [sage] 2019/09/16(月) 17:34:55.93 ID:hRvCpxCQ >>976 そう言うのは質問者に適宜やってもらえば良い 絶対マッチするという前提かもしれないし http://mevius.5ch.net/test/read.cgi/tech/1489511075/978
979: デフォルトの名無しさん [] 2019/09/16(月) 17:40:28.59 ID:enU8we0d >>969 知らなかった http://mevius.5ch.net/test/read.cgi/tech/1489511075/979
980: デフォルトの名無しさん [] 2019/09/16(月) 18:09:34.33 ID:enU8we0d const str = '30 8 year old humans' (([first, ...rest]) => [first, rest.join(' ')])(str.split(' ')) //=> ["30", "8 year old humans"] あ、正規表現がねぇw http://mevius.5ch.net/test/read.cgi/tech/1489511075/980
981: デフォルトの名無しさん [sage] 2019/09/16(月) 20:46:14.05 ID:RGmahsTZ .split(/ (.*)/,2) http://mevius.5ch.net/test/read.cgi/tech/1489511075/981
982: デフォルトの名無しさん [] 2019/09/16(月) 22:28:40.71 ID:enU8we0d 次スレ立てたんだけど、 Regular Expression(正規表現) Part15 https://mevius.5ch.net/test/read.cgi/tech/1568640311/ テンプレ貼ってたら>>3 がNGワードとやらで貼れません。 というわけであとよろしく。 http://mevius.5ch.net/test/read.cgi/tech/1489511075/982
983: デフォルトの名無しさん [sage] 2019/09/17(火) 10:37:10.53 ID:aFTX7+W5 >>982 >>3 のテンプレにある 【 初心者 】 正規表現 【 入門 】 ←閉鎖 http://funcchan.blog16.fc2.com/ 5ch では、fc2 は、宣伝禁止かも! これは、半角で書き込めないので、全角に変換した このURL を削除すれば? MANGO 板で、NG ワードを調べられる http://mevius.5ch.net/test/read.cgi/tech/1489511075/983
984: 977 [sage] 2019/09/17(火) 12:02:24.99 ID: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'
] ] http://mevius.5ch.net/test/read.cgi/tech/1489511075/984
985: デフォルトの名無しさん [sage] 2019/09/17(火) 16:12:25.16 ID:sjKTVv5w amazonもダメみたいだね、本の紹介しようとしたら弾かれた http://mevius.5ch.net/test/read.cgi/tech/1489511075/985
986: 983 [sage] 2019/09/17(火) 17:07:52.35 ID:aFTX7+W5 Amazon も、半角で書けないだろ 一番恐ろしいのは、はてなブログ! 書き込み禁止画面が出ずに、いきなり吸い込まれて、アクセス禁止にされる! 同様に、twitter の長いURL も、吸い込まれるものがあるらしい! 5ch で、しつこく宣伝する香具師をはめるために、いきなりのアク禁! MANGO 板に書き込んで、何がNG ワードが、地道に判定していくしかない http://mevius.5ch.net/test/read.cgi/tech/1489511075/986
987: デフォルトの名無しさん [] 2019/09/17(火) 17:46:48.25 ID:+bGUkqkJ test https://www.ama%7Aon.co.jp/dp/4938939703 http://mevius.5ch.net/test/read.cgi/tech/1489511075/987
988: デフォルトの名無しさん [sage] 2019/09/17(火) 17:53:38.97 ID:Xou3E6HC はてブのURL、5ちゃんに書けないのか。気づいてなかったわ。 http://mevius.5ch.net/test/read.cgi/tech/1489511075/988
989: デフォルトの名無しさん [] 2019/09/17(火) 17:56:58.73 ID:+bGUkqkJ test http://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 http://mevius.5ch.net/test/read.cgi/tech/1489511075/989
990: デフォルトの名無しさん [] 2019/10/02(水) 17:34:34.60 ID:dOlpIXop U . M . E http://mevius.5ch.net/test/read.cgi/tech/1489511075/990
991: デフォルトの名無しさん [] 2019/10/12(土) 20:41:17.72 ID:VAjNOt6S 以下を正規表現で行うにはどうしたらよいでしょうか。 -----元データ------------------ <aaa bbb ccc ddd> <eee> ffff ggg <hhh iiii> ----------------------------- -----欲しいデータ---------------- aaa bbb ccc ddd eee ffff ggg hhh iiii ------------------------------ http://mevius.5ch.net/test/read.cgi/tech/1489511075/991
992: デフォルトの名無しさん [sage] 2019/10/12(土) 20:46:20.53 ID:osgjxuFW 改行無視のオプション+<>の間を取得して改行を空白に変更でどう? http://mevius.5ch.net/test/read.cgi/tech/1489511075/992
993: デフォルトの名無しさん [sage] 2019/10/12(土) 22:51:54.37 ID: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のは一旦改行削除して、<..>
の前後に改行追加して、空行削除して、行頭の空白を削除してる http://mevius.5ch.net/test/read.cgi/tech/1489511075/993
994: デフォルトの名無しさん [sage] 2019/10/13(日) 01:09:33.88 ID: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", "") "" は、" "(半角空白)の間違いだろ http://mevius.5ch.net/t
est/read.cgi/tech/1489511075/994
995: デフォルトの名無しさん [sage] 2019/10/13(日) 01:37:59.89 ID:5y3mzviq >>994 コピペしたら元データに行末スペースが入ってたからそうしたんだけどこれは5chの仕様なのかな? 行末スペースがないなら空文字じゃなく半角スペースに置換だね http://mevius.5ch.net/test/read.cgi/tech/1489511075/995
996: 994 [sage] 2019/10/13(日) 03:33:31.81 ID: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 http://m
evius.5ch.net/test/read.cgi/tech/1489511075/996
997: デフォルトの名無しさん [] 2019/10/13(日) 07:48:23.30 ID:0NSyRtEU >>992-994 皆さんありがとうございました。 後方参照をさらに置換すれば良かったんですね。そんな方法があったとは!! 助かりました。 http://mevius.5ch.net/test/read.cgi/tech/1489511075/997
998: デフォルトの名無しさん [sage] 2019/10/13(日) 22:01:19.92 ID:5y3mzviq >>996 エディタのコマンドで対応できることだから わざわざスクリプト書くのはちょっとオーバーキルかな http://mevius.5ch.net/test/read.cgi/tech/1489511075/998
999: デフォルトの名無しさん [sage] 2019/10/13(日) 22:05:59.26 ID:w1EMiXuT VScodeの正規表現検索、置換はjavascriptだろうか? http://mevius.5ch.net/test/read.cgi/tech/1489511075/999
1000: デフォルトの名無しさん [sage] 2019/10/13(日) 22:42:48.39 ID:5y3mzviq >>999 ripgrep http://mevius.5ch.net/test/read.cgi/tech/1489511075/1000
1001: 1001 [] ID:Thread このスレッドは1000を超えました。 新しいスレッドを立ててください。 life time: 942日 20時間 38分 13秒 http://mevius.5ch.net/test/read.cgi/tech/1489511075/1001
1002: 1002 [] ID:Thread 5ちゃんねるの運営はプレミアム会員の皆さまに支えられています。 運営にご協力お願いいたします。 ─────────────────── 《プレミアム会員の主な特典》 ★ 5ちゃんねる専用ブラウザからの広告除去 ★ 5ちゃんねるの過去ログを取得 ★ 書き込み規制の緩和 ─────────────────── 会員登録には個人情報は一切必要ありません。 月300円から匿名でご購入いただけます。 ▼ プレミアム会員登録はこちら ▼ https://premium.5ch.net/ ▼ 浪人ログインはこちら ▼ https://login.5ch.net/
login.php http://mevius.5ch.net/test/read.cgi/tech/1489511075/1002
メモ帳
(0/65535文字)
上
下
前
次
1-
新
書
関
写
板
覧
索
設
栞
歴
スレ情報
赤レス抽出
画像レス抽出
歴の未読スレ
AAサムネイル
Google検索
Wikipedia
ぬこの手
ぬこTOP
0.033s