Regular Expression(正規表現) Part14at TECH
Regular Expression(正規表現) Part14 - 暇つぶし2ch871:デフォルトの名無しさん
19/06/24 21:24:32.12 4+LiJo6+.net
[??????????▲△??▼▽??◇?○◎●??????★☆?????♀♂?????♪?♭?♯??? 、。〃?々〆〇《》]

872:デフォルトの名無しさん
19/06/24 21:24:52.95 4+LiJo6+.net
[??????????△??▼▽??◆◇?○◎●??????★☆?????♀♂?????♪?♭?♯??? 、。〃?々〆〇《》]

873:デフォルトの名無しさん
19/06/24 21:28:31.79 4+LiJo6+.net
おわった
NG word 群が正規表現を妨げる
一文字限定なら [] の処理が早い
vim の :h digraphs
には 1300個ぐらいの 記号を含むデータリストがあるから
それから組みたてやすい とおもう

874:デフォルトの名無しさん
19/06/24 21:56:38.71 meJBThiE.net
NGワードと文字化けの区別ができない人は書き込んじゃダメ。

875:デフォルトの名無しさん
19/06/24 23:17:52.70 4+LiJo6+.net
そういえばブラウザに NG word に指定したのは自分だった
あらしが記号を使ってたことがあったので

876:デフォルトの名無しさん
19/06/25 07:18:11.77 0Do2GL77.net
荒らしが記号を使うことと書き込みを制限することに全く関連が無い

877:デフォルトの名無しさん
19/06/25 08:36:20.64 Y04/VZ6Y.net
URLリンク(i.imgur.com)
こう見えていたんだ
左がわひどいね ごめんね

878:デフォルトの名無しさん
19/07/08 00:38:09.05 m6vFYfK4.net
●Regular Expressionの使用環境
サクラ


879:エディタ(か秀丸エディタ) ●検索か置換か? 置換 ●説明 不定回数のパターンを置換したい。 ●対象データ [A=a,A=b,A=c,A=d,・・・・] ・・・・の部分はどこまで続くのかは決まってない。が、多くても20個くらい ●希望する結果 A=a,b,c,d・・・・



880:デフォルトの名無しさん
19/07/08 05:29:01.40 9IE9wmRC.net
(?<!^)A=

881:854
19/07/08 23:27:17.45 Rb/08H3f.net
>>857
ありがとうございます。
否定戻り読みってこうやって使うのですね。
もうちょっと深掘りして以下の場合どのようになるでしょう。
■対象データ
[A=a OR A=b OR A=c OR A=d・・・・]
[B=d OR B=c OR B=b OR B=a・・・・]
[C=a OR C=b OR C=c OR C=d・・・・]
■希望結果
A=a,b,c,d
B=d,c,b,a
C=a,b,c,d
ORの部分が難しくて混乱しています。。

882:デフォルトの名無しさん
19/07/10 08:43:33.27 WA2fRW/e.net
\s++OR\s++.=
,

883:デフォルトの名無しさん
19/07/10 09:18:54.80 StxWbt+s.net
ここの住民の正規表現能力は超人的だ
お節介させてくれ
もし使用環境に perl があれば、
ウルトラ難しい正規表現を理解可能な小さなパーツに分類できる
cat /dev/clipboard
[A=a OR A=b OR A=c OR A=d・・・・]
[B=d OR B=c OR B=b OR B=a・・・・]
[C=a OR C=b OR C=c OR C=d・・・・]
cat /dev/clipboard | perl -ne 'if ( m{^ \[ ( \w+ [=] ) }xcm) {print $1}; { if ( m{ = (\w+) \s }xcg ) {print "$1,"; redo} if ( m{ = (\w+) \S }xc ) {print "$1\n"} }'
A=a,b,c,d
B=d,c,b,a
C=a,b,c,d

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

885:854
19/07/11 01:01:12.77 /KpWZOtx.net
>>859
すごい。。
置換できましたありがとうございます。
が、情けない話ですがなぜこういう置換結果になるのかが理解できません。
良ければどなたか解説いただけないでしょうか
>>860
ほんと、超人的ですね。。
Perlでのご教授ありがとうございます。
1度組んでしまえば汎用的に使えそうですね。

886:デフォルトの名無しさん
19/07/11 21:00:44.92 SCYCuKB+.net
>>862
URLリンク(github.com)

887:デフォルトの名無しさん
19/07/13 20:47:25.54 57lWPs8z.net
動作についての質問です。よろしくお願いします。
●Regular Expressionの使用環境
JavaScript (chrome)
●検索か置換か?
検索
●説明
'@time;prop1:style1;prop2:style2'.match(/(^|[@;])[^@;]*/g); が
["", ";prop1:style1", ";prop2:style2"] になる理由が分かりません。私の理解では、
["", "@time",";prop1:style1", ";prop2:style2"] となって欲しいところです。
どなたか説明お願いします。
^は文字列検索位置を「動かさない」と認識しています。
(以前は「動かす」と誤認識していましたが、何かで見解を改められたことを記憶しています)
●対象データ
ID@time;style 形式の指定で、
ID、time、styleの省略は全てありで、timeとstyleの順序は自由(IDは必ず先頭)
@開始はtime指定、それ以外はstyle指定とし、デリミタは ; としています。
この形式で任意の文字列(ユーザー入力)を処理します。
なお、'@time;prop1:style1;prop2:style2'.match(/(^.|[@;])[^@;]*/g); では希望の解
["@time", ";prop1:style1", ";prop2:style2"] を得られていますが、
デバッグ中に上記に引っかかったので、分かりましたらよろしくお願いいたします。

888:デフォルトの名無しさん
19/07/13 23:13:26.72 57lWPs8z.net
正規表現の問題ではなくJavaScript固有の問題のようなので、質問を閉じ、
JavaScriptスレにて質問し直します。
興味のある方は以下をご覧ください。(これからすぐ投稿します)
スレリンク(tech板:341番)-

889:デフォルトの名無しさん
19/07/13 23:31:59.74 57lWPs8z.net
すいません自己解決しましたが一応。以下となりました。
スレリンク(tech板:341番)-342

890:デフォルトの名無しさん
19/07/14 04:59:50.53 XILHsvHP.net
この質問内容ならここで合ってます、jsスレよりもこのスレ向きです
正規表現には統一規格みたいなものは存在しないので環境によって動作が異なります
このスレの住民なら2番目のマッチが t から始まる環境も想定します
["","time", ";prop1:style1", ";prop2:style2"]
詳しい仕様を知らなくても動作を確認するコードを作っていろいろ試すと
どう動く環境なのかだいたい分かってしまうことが多いです

891:デフォルトの名無しさん
19/07/14 08:17:29.28 LdVrbIxu.net
>>867
> 正規表現には統一規格みたいなものは存在しないので環境によって動作が異なります
これは知ってますがBREの範囲だと当然間違いなく動くし、
ほぼPCREに向けて統一中、といったところなのでは?
まあやたら複雑になってバックトラッキング等の問題が発生し、
結果的に速いライブラリに収束して行っているのはいいことだと思いますが。
> このスレの住民なら2番目のマッチが t から始まる環境も想定します
> ["","time", ";prop1:style1", ";prop2:style2"]
これは一応アウトなのでは?正規表現自体はデリミタごと取り込もうとしており、それが出来ていません。
これを言うならJavaScriptもアウトですが。
個人的にはJavaScriptは面白いのですが仕様がイマイチなところが散見されるのが難点ですね。
それが初心者に無用な混乱を引き起こし、上達の妨げになっている。
今回私も数時間無駄にしましたが、これが初心者だと脱出出来なくて誤解したままになってしまう。
そして本人はそれを自覚出来ず、Web上に間違った情報を垂れ流し、馬鹿が再生産されるというループになっている。
この意味では正規表現の現在の状況も同じようなものですが、
正規表現は「実装の幅がものすごくある」と共有されているだけまだましです。
JavaScriptの連中はその間違った実装を「正しい」と思いこんでいたりするので、会話が成立しません。
といってもJavaScriptのString.matchの仕様バグを今更直すことも出来ず、未来永劫このままだと思いますが。

892:デフォルトの名無しさん
19/07/14 10:58:08.46 wR6d2dgQ.net
PCREに向けて統一中なんてどんな根拠で喋ってんだ
regex101で試してみれば分かるけどPCRE使ってるPHP以外のPython, ECMAScript, Goは全滅だぞ

893:デフォルトの名無しさん
19/07/14 12:13:01.78 LdVrbIxu.net
>>869
ゴミという意味でだろ。
逆にお前はどう思ってるんだ?
JavaScriptのString.matchについては単にパッチを実装する場所を間違えただけ。
結果、String.match と RegExp.exec での結果が異なるという、言語内での不一致を引き起こしてる。
そしてこれはもう修正されることはない。
仕様バグとして永久に残り、プログラマに無駄な時間を消費させるだけのものとなる。
結果、言語が腐っていく。
正しくは RegExp.exec 側を修正し、両方とも無限ループにならずに
["", "@time",";prop1:style1", ";prop2:style2"]
を返すべきだった。
RegExp.lastIndex だけで状態管理出来ると「間違えた」からそうなった。
本来は先頭マッチフラグ RegExp.canMatchHead みたいなのが必要で、それを実装すれば両方とも正しい結果を返せた。
それを実装せず、String.match に間違ったパッチを当てたからそうなった。
これは実装者(おそらくブレンダンアイク本人)の判断ミスだ。
正規表現はPerlが再定義したと言っていい状況だ。だからみんなPCREを見てる。
PHPはさっさと取り込んだ。これは正しい判断だ。
JavaScriptはPCREを見てる。というか本来は取り込みたいのだろうが、上記のように今更部分がありすぎる。
Pythonには歴史的経緯があるのだろう、状況は知らん。
Goは最初から既にゴミだ。確実に廃れるだろうし、俺もそれを願っている。
そもそもGoなんてPCREが覇権取ったあとに出てきたのにPCREを採用してない時点でゴミ。
それ以外にもあの言語は独自路線を行き過ぎていて、ユーザーに無駄な勉強時間を強いている。
結果、既に他言語で慣らした強者が近づかず、結果的に馬鹿の楽園になってWeb系の馬鹿共に大受けしてるだけ。
Goの正規表現については詳しくは知らんが、仮にそれが奇妙な振る舞いをしたとして、お前はGo側の怠慢だと思わないのか?
JavaScriptやPython等それなりの歴史があるのならともかく、Goの場合は確実に防げた問題でしかない。
連中はそれを「わざと」やらなかったんだぞ。俺はそんな言語は支持しないし、ゴミだと何度でも断言する。
いずれにしても、今からの初心者が学ぶべきはPCREだろ。
お前は何が言いたいんだ?

894:デフォルトの名無しさん
19/07/14 12:35:52.54 QmWR+pGh.net
ゼロ幅で永久にマッチし続けるのになんで@timeに進めると思うの?

895:デフォルトの名無しさん
19/07/14 13:05:26.62 LdVrbIxu.net
>>871
お前は実装と仕様の違いを理解出来てないタイプだな。

String.matchは「マッチ全部を配列で返す」メソッドだ。
当然、無限ループなんてしてはいけない。
(ただし無限ループしない為に空文字マッチだと一文字進めるパッチだから仕様バグになってるが)
RegExp.execは「gマッチを一つずつ実行し、ユーザーがそこで適宜処理を行う」為のメソッドだ。
当然、何もしなければ順に次のマッチをしていくのが正しく、今現在のように無限ループするようでは駄目だ。
結果、今はユーザーが本来不要なコードを毎回書く羽目になってる。
具体的に言えば、 if (match!=='') が毎回必要になる。これが無駄だ。
JavaScript界隈にはお前みたいな馬鹿が多い。
本来はどうあるべきか、或いは何故この無駄なコードが必要なのか分からず、
今の「実装」が正しいと思いこんでいるタイプだ。
動かさないと分からない、あるいは動いていればいい程度のコードしか書けないからだが。
とはいえ、今回のようなケースに遭遇するとそうなるのも分かる気はするが。

いずれにしても、これはJavaScript環境固有の問題で、ここでは割とどうでもいいと思うが。
お前が正規表現として /(^|[@;])[^@;]*/g を書いたとき、全ての環境で無限ループするべきだ!と思っているのならそれでいいが、
実際はそうではないだろ?なら無駄にいちゃもんつけるなよ。

896:デフォルトの名無しさん
19/07/14 13:21:26.40 XILHsvHP.net
>>868
"t" からマッチは誤りでした、申し訳ない..
タグの外側だけ対象に置換する
URLリンク(www.din.or.jp)
この記事の動作のことを言いたかったんですがうろ覚えのまま
適当に書いてしまいました、ごめんなさい

897:デフォルトの名無しさん
19/07/14 13:28:58.74 wR6d2dgQ.net
>>870
PCREに統一中だという主張の根拠を聞いたんだがそれへの回答はないわけだ
PCREが素晴らしい実装で最初に触っとけばいいというのは同意するが, それが最良だなんてのはあり得ないし単なる妄想だよ

898:デフォルトの名無しさん
19/07/14 14:15:14.24 LdVrbIxu.net
>>873
ああなるほど、Perlも似たようなゴミ実装になってるな。
> そこで,Perl では空文字列に マッチするような場合には,初回は空文字列がマッチするがそれ以降は マッチせずに必ず 1文字分は進むようにマッチしようとする.
これも実装ミスだ


899:な。 正しくは、このフラグを「空文字以外のマッチごとにセット」すればいいだけで、修正は1行で済むのだが、こちらも今更なのだろう。 「初回は」というのが間違いで、「空文字にマッチした直後は」が正しい。 ついでにもっと具体的に言っておくと、「初回は」というのが正しければ、 今の実装は検索起動時にフラグをセットして空文字マッチ後にリセットしているはず。 このフラグを「空文字以外のマッチ後」に毎回セットし直すように1行入れる。これで直る。 君がPERL等のOSSか何かにcontributeする気があって修正案を出してくるのなら見てあげるけど。 (俺自身ではそこまでやる気はない) まあしかし、JavaScriptだけがゴミじゃない、ってのは分かった。 というかもしかしてJavaScriptの実装ってPERL実装互換に敢えてしてる? >>874 お前は何派なんだよ? JavaScriptに関してはMDNでも前は「PCREで大体使えます」みたいな事書いてたぞ。 最近大幅リニューアルしてその記述はなくなったが。 (というより色々見にくくなってあまり確認してない) 鬼車派ならこの手の「実装ミス」をひたすら潰しておけばワンチャンあるかもしれんよ。 JavaScriptにしてもPerlにしてもこの辺のミスは確実に足枷になってる。 具体的に言うと遭遇した全プログラマが数時間ずつ無駄に検索その他をさせられる羽目になってる。 これは「新規プログラマ」からすると上達を妨げる障壁でしかない。 JavaScriptで言うと「IEデハー」な件を全部暗記してて今もそれにすがっている奴のウザさみたいなもんだ。 仕様バグがない、というのはそれなりに武器になる。



900:デフォルトの名無しさん
19/07/14 15:13:19.95 LdVrbIxu.net
>>869
今更regex101で確認してみたが、PCREだけは(これに関しては)正しく通るじゃねえかよ。
Perlの「初回は」というのはつまり g の時だけおかしくなるということであり、今回は当たらないからだが。
だからJavaScriptも仮にPerl実装互換にしようとしたとしてもしくってるな。

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

901:デフォルトの名無しさん
19/07/14 15:29:05.53 XILHsvHP.net
>>876
> > と < は後読みと先読みにして外に出すことができるので
これは文字を消費しないための措置
マッチさせたい部分以外の部分にまでマッチしてしまうと次回の
検索開始位置が意図しないところに進んでしまったりするので先読みを
使って消費しないようにします
あとあなたが言ってることにはおおむね同意です
変な挙動は無くなるといいですね、perl6に期待したいところだけど
perl6では出来る限り最長文字数のマッチを目指す挙動になると聞いたような..
自分にとっては処理が重くなるのであまり嬉しくないですね..

902:デフォルトの名無しさん
19/07/14 16:03:14.68 LdVrbIxu.net
>>877
ああなるほど、\G使ってるからずれるのか、確かに。
BRE出身だから個人的には最初から />[^<]*</ が第一選択肢で、
筆者の発想が意味不明だったのだが、確かにそうだな。
ここら辺は正規表現だけで何とか出来る(Perl)思想と、
BREだけではどうにもならないからざっくり切り出して自前でプログラミングする(AWK)思想の違い�


903:セな。 Perl6はガン無視されてる感があるけどね。 今更Perlで組めるかよ、というのはPerlを使っている奴自身が感じていることらしいし。 (もっとも嫌われてる言語がPerl、2017はダントツの一位、 しかし同じStackOverflow実施の2018の結果はVBでperlは落ち着いたようだが) https://stackoverflow.blog/2017/10/31/disliked-programming-languages/ https://news.mynavi.jp/article/20180604-639227/ もしかしてPerl6って徐々に使われだしてる? > perl6では出来る限り最長文字数のマッチを目指す挙動になると聞いたような.. ん? 全てのプログラミング言語では最長マッチがデフォ、 というかそもそも下位の正規表現(BRE等)にはそれしかないが。(non-greedyがない) XPATH等の文書検索側の人かな?だからって別に特に問題はないが。



904:デフォルトの名無しさん
19/07/15 15:22:14.71 y88H95dP.net
Ruby で、
str = "@time;prop1:style1;prop2:style2"
re = /((^|[@;])[^@;]*)/
p results = str.scan( re )
# [["", ""], [";prop1:style1", ";"], [";prop2:style2", ";"]]
[ 0 ]がマッチした部分、[ 1 ]がキャプチャー部分
>>864
の、["", ";prop1:style1", ";prop2:style2"] と同じ結果

905:デフォルトの名無しさん
19/07/15 16:42:33.19 xqOJLOC2.net
>>879
テストしてくれたって事か?なら一応まとめておく。

/(^|[@;])[^@;]*/g に対してテスト文字列 '@time;prop1:style1;prop2:style2' で
PCRE: ["", "@time",";prop1:style1", ";prop2:style2"]
JavaScript, Python, Go, Ruby, : ["",";prop1:style1", ";prop2:style2"]
結論、PCRE以外全部ゴミ
現時点でPCREが最良だ馬鹿タレ >>874
お前が何派か知らんが、PCREが最良でないと言い張るのなら少なくとも通るライブラリを具体的に提示しろ

ただまあこれにはちょっと情状酌量の余地有りで、
おそらく ^ が「先頭文字」ではなく「位置」にマッチすると再定義したのはPerlだ。
そもそもBREには | がない。従って (^| のような「先頭の空文字」マッチなんて書けない。
だからBREだと先頭の「位置」なのか「文字」なのかを厳密に区別する必要がない。
| が導入されたのはEREからだが、EREなんて大して使われてない。
結果、BRE育ちの連中が「位置」だと厳密に認識せずにコーディングすると間違える、というわけ。
そしてJavaScript, Python, Go, Ruby は全滅だ。
JavaScriptに関してはPerlを模倣したわけでもなく、単なるミスだ。言語内不一致を生じているし。
他言語は知らん。
Rubyみたいに「実装が仕様だボケ」と言い張る糞言語ではこの手の仕様バグを永久に修正出来ない。
よって新人は毛嫌いして離れていく。当たり前の話だ。
JavaScriptはおそらくバグだと認識されているが、今更直せない。
Perl6はこの点、仕様と実装を分離したから、バージョンアップと共に確実に修正する。
従って最良は現時点でもPCREだし、今後ともPCREだ馬鹿タレ >>874

906:デフォルトの名無しさん
19/07/15 23:23:32.64 3MPTmFRg.net
BREの正規表現と今の正規表現の使い方の違いの話は面白いなぁ
しかしこの人こんなにすごいスキルとモチベがあるなら質問なんかせずに
自力でなんとか出来たのではw
質問してくれたおかげで面白い話をいろいろ聞けたからこちらは嬉しいけどネ
おかしな挙動と言えばperl5とOnigmoでは\Gの挙動に違いが
あってどちらかが違和感のある動作をしたはず
\Gの概念自体が微妙に違ったはずだけどメモるの忘れた
興味のある人はぐぐってね

907:デフォルトの名無しさん
19/07/16 15:24:59.03 wQsYVdH6.net
ネット弁慶がイキりたかっただけでしょ

908:デフォルトの名無しさん
19/07/16 16:08:47.84 cpfSTA9t.net
>JavaScript, Python, Go, Ruby, : ["",";prop1:style1", ";prop2:style2"]
深くて理解できないことが多いが、これはやばい気がする

909:デフォルトの名無しさん
19/07/16 17:23:30.54


910:hAAouWtx.net



911:デフォルトの名無しさん
19/07/16 18:30:33.69 AvaVqNzm.net
一所懸命挑発的に書いてるのに全然乗ってもらえなくてかわいそう

912:デフォルトの名無しさん
19/07/16 19:27:45.24 hAAouWtx.net
言ってることに説得力がありすぎて聞き入ってしまってたよ
どんどん言いたいことを言って欲しい
昔のdanさんを思い出すなぁ

913:デフォルトの名無しさん
19/07/16 20:41:55.62 bFMew56o.net
入力フォーマットが正しいという前提で /@?[^@;]+/ の方が好み
そもそも正規表現使うより ; でsplitした方が良くね?とおm

914:デフォルトの名無しさん
19/07/16 21:03:17.33 hMJFhr7R.net
>>883
深くはない、単にバグってるだけ。
そしてそれはやばいどころではなく、全く話にならないレベルの物だ。使い物にならない。
例えば、図書館の蔵書をユーザーにも検索出来るようにしたとして、正規表現検索も選べるとしよう。
この場合、検索結果に現れないケースが発生することになり、使い物にならない。
プログラミング言語内の正規表現エンジンは「今までのプログラムが動かなくなる」危険があるからそうそう交換出来ないが、
図書館DBの検索フロントエンド内のエンジンなんて即交換可能なんだから、問題があればすぐ乗り換えられる。
PCREが気に入らないのならこんなところで無駄吠えするのではなく、
PCREがバグっているケース(例のタグ外側マッチとか)でもばっちり動く検索エンジンを提供して、乗り換えを待てばいいだけ。
現状、PCRE以外全部バグっているのだから救いようがないが。
JavaScriptの場合はatomエディターなる物があって、htmlやプログラムソースコードを編集出来るが、
JavaScriptの場合はreplaceもバグっているので、命中すれば、全置換しても全置換出来てないケースが発生する。
リファクタ等で変数名を変えるとき、手でやるとバグるので、当然エディタ機能で全置換させるわけだが、この場合にもバグる訳だ。
そしてユーザーはこのときに置換漏れが発生するとは全く思わないので、かなり手間取ることになる。
(atomでは対策されていると信じたい)
JavaScriptの場合はこのバグも「仕様」としてしまっているので、
逆に言えば仕様通りならバグに命中したときの挙動も確定してる。だから対策は出来るが、
Rubyみたいに「実装が仕様だ」と言い張る糞言語だとどういう挙動か確認してみなければ分からず、対策が出来ない。
ここらへんもRubyの思想は数周遅れている。
いずれにしてもこんな基本的なところのバグはあっても迷惑でしかなく、さっさと直せ、でしかない。
「速い」以前に「ヒットしない」エンジンなんて使い物にならないだろ。
エンジン競争しているつもりの馬鹿共も、方向性を完全に間違ってる。
「間違いなく動作する」エンジンを提供すれば、文書検索側の人間はサクッと乗り換えてくれるだろうさ。
速い遅いはその後の話だ。

915:デフォルトの名無しさん
19/07/16 21:18:41.35 hMJFhr7R.net
>>881
BREの場合はやりきる前提ではないので、例えば例のタグ外側マッチだと、
元の文字列に > と < を足してしまって置換し、出力時に削る、みたいなことをする。
具体的には以下。
('>' + str + '<').replace(/>[^<]*</,'>bar<').slice(1,-1)
だからBREしか使えないAWKでも意外と何とかなったりする。
ただしこれはプログラミング出来る前提であって、
Webページに検索窓だけ提供されているような状態ではどうにもならないが。

>>887
それは正しい。実際俺もそれに近いことをしている。
デリミタが最初に出現もあり、最後に付加もあり、つまり
';prop:style1' や
'prop:style1;prop:style2;' もありなので、
結局 /(^|[@;])[^@;]*/g だと後のコードが綺麗に書けなかった。 /(^.|[@;])[^@;]*/g でも同じ。
意味的には @ もデリミタ扱いしているだけなので、実もフタもないが、@を ;@にしてsplitした。
具体的には以下。
str.replace(/@/g,';@').split(';').filter(v=>v)

916:デフォルトの名無しさん
19/07/16 22:42:20.32 P37s1FHo.net
一度言った内容は繰り返さなくていいです

917:デフォルトの名無しさん
19/07/17 08:28:41.50 2/Bgill9.net
>>875訂正
俺は俺のケースだけ考えていたが、これだと871内URLの筆者のケースと合致しない。
そこで一応、両方とも合致する実装を考えてみた。
(といってもバグってる実装について推測すること自体はあまり意味がないが)
Perlはおそらく、^のフラグではなくて、空文字マッチ後のそのマッチ区間の*を+にしてる。
(というより筆者もそう言っているのだが俺が早とちりしてしまった)
871のケースだと、正規表現 (?:^|>)(.*?)(?:$|<) に対して、
1回目:(?:^|>)(.*?)(?:$|<)
2回目:(?:^|>)(.+?)(?:$|<)
というわけだ。結果、2回目は「先頭、<含んだ1文字、次の<まで、となり、
その筆者の説明通り先頭タグを含んで次タグ或いは文末まで伸びることになる。
俺のケースでは、正規表現 (^|[@;])[^@;]* に対して、
1回目:(^|[@;])[^@;]*
2回目:(^|[@;])[^@;]+
だから '@time;prop1:style1;prop2:style2' に対して @time のマッチも正しく取れることになる。
こういった場合、実装者は安全側に倒したくなる物だが、
現実は安全側に倒しすぎて余分なケースを含んでしまい、結果、バグっているというわけだ。
JavaScriptは最高に安全な実装、「空文字マッチは1文字進める」とした。(おそらくRubyその他もそう)
これだと絶対に無限ループはしないが、俺のケースでバグる。
Perlの実装だと俺のケースは通るが、871内URLの筆者のケースでバグる。
その他バグケースも出してくれれば俺の推測で合っているかどうかは答える。

918:デフォルトの名無しさん
19/07/17 08:28:59.00 2/Bgill9.net
正しい実装は、「経路全体」(つまりツリーのリーフ)に対してフラグを持たないといけない。
Perlは「区間」(=経路の一部)に対してフラグをつけてしまったところが間違いだ。
871のケース、単純化する為に (A0|A1)B(C0|C1)として、
1回目:A0BC1 で空文字マッチ
そして空文字マッチの場合はこれを記録し、これと同一の場合は次回以降はスキップする。
結果、2回目:最初に A0BC1 がマッチするがこれは捨てられ、次に A1BC0またはA1BC1となる。
そして非空文字マッチとなったので、この記録を全破棄して、同様にループを繰り返せばいい。
実装の修正は、探索関数そのものにだいぶ手を入れないといけないのでそれなりに大変だ。
まずは全部の最終段に「最終チェック」を入れて上記リストと照合、記載有ればマッチ失敗として探索継続、としなければならないが、
おそらくこれが1ヶ所では済まない。
ただしこれはリターンパスを辿ればいいので何らかのツールが有ればほぼ自動でいけるかもしれない。
次に上記リストを作成する為に全経路を出力させなければならない。
デバッグ用にこれが既にあればラッキーだが、なければ自前で作らなければいけない。
といっても内容はツリーのノードを辿るだけなので、ツリーのフォーマットが分かればすぐだが、
ゴリゴリに高速化とかしていると割と意味不明なコードになっていることが多いので、
その状態で確認するのは結構辛いとは思う。
リストの管理は、空文字マッチなら追記、非空文字マッチならクリア、なので、これはやるだけだ。
リストの管理も探索関数にやらせて、探索関数は
今:マッチ場所とマッチ長さを返す
修正後:マッチ場所とマッチ長さを含んだ『配列』を返す、とし、
「空文字マッチの場合は自動で継続、非空文字マッチまたは終了まで探索、まとめて配列で結果を返す」とするのがいいだろう。

919:デフォルトの名無しさん
19/07/17 08:29:16.56 2/Bgill9.net
なおPerlの実装だと『上位関数のみ』で対策できるため、
「取り敢えず1時間で直せ」と言われたらこうなるのも分からなくはない。
しかしいまだにそのままだというのは怠慢でしかないが。
JavaScript等も同様、『上位関数のみ』で対策出来るところで留まっている点からも、これは言える。
しかし現時点で世界中のプログラマがどれだけ無駄な時間を消費することになっているのかを考えれば、
こんなのは手間であろうがさっさと直せ、でしかないが。
いずれにしても、俺が修正してやる、修正案はこれだ!と具体的に出してくるのならレビューはする。
我こそは!という奴は頑張れ。

920:デフォルトの名無しさん
19/07/17 09:46:24.93 u050lnGw.net
話を単純化すると、
1. ある文字、例えば@ から、次の@ の直前の文字まで
2. 先頭が、@ でなければ、先頭から、@ の直前の文字まで。
つまり、先頭が、@ でなければ、先頭文字を、@ とみなして処理する
つまり、ルール1・2は、同時に適用させず、先にルール1を適用し、
ルール1に適用しないものだけを、ルール2に使う
(^|[@;])[^@;]*
だから、この正規表現がおかしい。
定義があいまいになる、解釈を含んでいる!
OR の部分が、並列ではない。
ルール1を優先すべき!

921:892
19/07/17 09:51:38.77 u050lnGw.net
(^|[@;])[^@;]*
OR を使うと、両方に該当する場合に、どちらの処理がされるのか、あいまい!
つまり、先頭文字が@; の場合に、両方に該当するので、処理があいまい!
A|B
A, B 両方に該当する場合に、A,B どちらの処理がされるのか、あいまい!

922:デフォルトの名無しさん
19/07/17 09:53:34.46 RL7WDafS.net
左側優先とかないのかこれ?

923:877
19/07/17 10:06:18.04 u050lnGw.net
>>891
Ruby で、
str = "@time;prop1:style1;prop2:style2"
re = /((^|[@;])[^@;]*)/
p results = str.scan( re )
# [["", ""], [";prop1:style1", ";"], [";prop2:style2", ";"]]
[ 0 ]がマッチした部分、[ 1 ]がキャプチャー部分
>>864
の、["", ";prop1:style1", ";prop2:style2"] と同じ結果
# * を、+ に変えた。
re_2 = /((^|[@;])[^@;]+)/
p results_2 = str.scan( re_2 )
# [["@time", "@"], [";prop1:style1", ";"], [";prop2:style2", ";"]]

924:デフォルトの名無しさん
19/07/17 13:38:56.68 FD/sfaX1.net
小飼って糖尿病で死んだんだっけ

925:デフォルトの名無しさん
19/07/17 14:01:11.32 fOq5lc1d.net
質問させてください。
PCRE や bregonig で大文字・小文字の区別なしで\x{017F}がsやSにマッチしてしまうのは仕様ですか?

926:デフォルトの名無しさん
19/07/17 15:07:35.98 Jmalh7Yl.net
>>889
>('>' + str + '<').replace(/>[^<]*</,'>bar<').slice(1,-1)
おぉ、perlの正規表現なら正規表現だけで大抵のことは出来るから
自分には前処理をするという発想がなかった、目からうろこでした
今回のケースもこの方法でデータの前後に ; を付ければ簡単になりましたね
>>899
\w が あ にマッチするくらいなので仕様なのでは
オプションでマッチしなくしたり出来るのでオプションのヘルプを見ましょう

927:デフォルトの名無しさん
19/07/17 20:30:56.60 2/Bgill9.net
>>896
ないね。
聞いたこと無いし、JavaScriptで試した限り ([@;]|^)[^@;]* でも結果は同じだった。
ただ、確かに普通に考えたら左優先でいいし、上記入れ替えで @time をキャプチャ出来るようになるべきではある。
言われてみれば優先順位が決まってないことに驚きだ。

928:デフォルトの名無しさん
19/07/17 20:37:09.24 RL7WDafS.net
>>901
ちょっと知識が深まったよ サンクス

929:デフォルトの名無しさん
19/07/17 20:40:11.08 2/Bgill9.net
>>897
お前は毎回Rubyの話をどのスレにも持ち込んでいる荒らしだろ。
何か言いたいことがあるのなら必ず結論を書け。
何が言いたいのか分からないのでウザイ。だから荒らしなんだよ。

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


930:ェ俺の主張であり、JavaScriptスレに勝手に依頼しておいた。 以前RegExp.testの件で同様に依頼したら追記されたから、そうなるのを願っている。 そういう、「落とし穴」は共同して塞いでいかないと駄目なんだよ。 完璧な言語なんてない。だから多少バグがあるのは仕方ないとして、 それを未来永劫新規プログラマに押しつけて「キャハハー、お前も落ちたか!」なんてやっているようでは駄目なんだ。 Rubyはプログラマに対してリスペクトが全くない。だから廃れるし、俺もそうなることを願っている。 お前はRubyを吹聴しさえすれば布教出来ると勘違いしているようだが、そんなことはない。 当たり前だが新人にとってはこんなバグにつき合わされること自体大迷惑でしかないんだよ。 今回のでもPCREが一番ましだし、Rubyなんて選ばれる理由がないだろ。 ゴミだと分かっているものを広めるのは、単なる詐欺師でしかないぞ。 お前はお前の行為によってRubyへの反感を得ているだけなことを自覚した方がいい。 あちこちのスレでお前は相当ウザがられてる。 そういうのではなくて、バグを修正するとか、仕様書に明記するとか、 何でそういう建設的な方向に努力出来ないんだ? こういう地道な積み重ねを全くやってないからRubyの現状はあるわけでさ。



931:デフォルトの名無しさん
19/07/18 16:11:19.79 Y8yxmCyC.net
今の複雑化した正規表現エンジンってエンジンを作った人ですらどう動くのか
予測が難しいところがあるのでは
バグと言えばバグだけど総合的に考えてみてこの動作が最適だからこのままにしよう
という部分もたくさんあると思う
だから怠慢という言葉はちょっと違う気がするなぁ
あとrubyの正規表現エンジンは空文字マッチが~の件は
つまりonigmoのことを言ってるんだけどonigmo自体は空文字マッチに
対応してると記憶してるからrubyモードの仕様なんじゃないかな

932:デフォルトの名無しさん
19/07/18 20:03:10.71 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
> URLリンク(perldoc.perl.org)
グダグダ説明はしてあるがPerlは読めんから詳細まで俺の読み通りかは分からんが。
いずれにしても、JavaScriptとPerlは仕様化してる。
Rubyが仕様化しておらず、これが大問題だと認識出来ないのは、Ruby界隈にはまともなプログラマがいないからだよ。

933:デフォルトの名無しさん
19/07/18 20:22:20.04 Y8yxmCyC.net
BREという超シンプルな正規表現エンジンが持っていた明解な動作の分かりやすさを
現代の超複雑な正規表現エンジンに求めることには無理がある
ちょっと挙動が変なところがあるけどこのほうが便利だよねってのが現代の考え方
なんじゃないかな、それに適応してるのが現代のプログラマということだろう
ゼロ幅マッチで1歩進む件もそういう挙動にするメリットがあるから
そうしてるんだろう、どんなメリットなのかは分からないが
コスト的な問題やセキュリティ的な問題かも知れない
時代遅れのプログラマが何を言おうが正直興味ないわ
現代の正規表現で見れば初心者だし
初心者が内部動作の仮説を立てたところで当たるわけがない
しかもたった数例のコードの動作を見ただけでだ、あほらしい

934:デフォルトの名無しさん
19/07/18 20:44:40.06 PnG1z3PK.net
>>904
お前みたいなゴミに回答する意味はないが、一応つけておいてやる。
> 今の複雑化した正規表現エンジンってエンジンを作った人ですらどう動くのか
> 予測が難しいところがあるのでは
そんなわけあるか馬鹿タレ。
今現在もスクリプタはプログラマからすると一段下に見られてて、
「スクリプタをプログラマと呼ぶな」という奴も一定数居るだろ。
その理由がこれだよ。
ガチのプログラマは数年前に他人が記述したコードでも必要あれば修正するしかない。
だからこの為に多大なる手間をかけてコードを整備してる。
スクリプタがやってる、今書いて今動いたら捨てておk、なんて甘い世界ではない。
まともなコードなら未来永劫整備可能だし、また、それを目指しているのがプログラマだ。
実際、Linuxなんて30年越しで整備され続けてるだろ。
数年前にお前が書いたコードすら読めないのは、お前の問題であって、それを全体のように言うな。
だからスクリプタは馬鹿にされるし、嫌われるんだよ。
正規表現エンジンなんてプログラミング全体からするとかなり簡単な部類だ。
動けばいいだけのエンジンなら再帰しまくりで1000行程度だろう。
最悪全交換でいい規模だから、そこまでガチで整備されている事は期待出来ないが、
それにしてもこの程度の規模のプログラムを読めない、ってことはあり得ない。
高速化はプログラムに対して「複雑度」を増すものではない。
具体的に言うと、静的コールグラフを複雑化することはなく、
単に遅い関数を速い関数に入れ替える、というのが基本になる。
だから、正規表現エンジンを読めない、というのなら、書いた奴か読む奴が馬鹿なだけであって、
ちゃんとした奴が書いたエンジンをちゃんとした奴が読めば確実に読める。

935:デフォルトの名無しさん
19/07/18 20:46:26.35 PnG1z3PK.net
> バグと言えばバグだけど
単なるバグだ馬鹿タレ。
> 総合的に考えてみてこの動作が最適だからこのままにしようという部分もたくさんあると思う
非互換になるのでどこでアップデートして修正するかは言語側の選択となる。
だからその前段階、つまり今どこにバグがあってどれくらい問題なのか把握し、
それを広報して共有し、どのタイミングで修正するかを話し合わないといけない。
Rubyはこれが全く出来てない。だからゴミのままなんだよ。
> だから怠慢という言葉はちょっと違う気がするなぁ
バグだと認識した上で、それを仕様として広報するのが最低の義務。
JavaScriptとPerlはそれをやっている。
Rubyの現状はバグに気づいてないか、敢えて黙っているかで、どちらにしても糞でしかない。
> つまりonigmoのことを言ってるんだけどonigmo自体は空文字マッチに
> 対応してると記憶してるから
お前がどんだけ馬鹿なのか分からないが、「バグ」ってのは意図してない動作のことを言うんだぞ。
つまり、対応してるつもりが対応できてないから「バグ」なんだよ。
> rubyモードの仕様なんじゃないかな
そう言うのはちゃんと調べてから言え。希望的観測ではミスリードを大量発生させる。
そしてこれをやりまくっているのがJavaScript界隈で、結果、JavaScripterは馬鹿が再生産されまくってる。
そういうのは止めろ。お互いに得る物がない。

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

936:デフォルトの名無しさん
19/07/18 21:56:03.46 xdHI+pcE.net
荒らしと会話するな!
荒らしと会話する者も、荒らしだぞ!
プログラマーとは、コードで語る者だけ!
能書きはいらない!
そいつらは荒らしだから、会話するな!

937:デフォルトの名無しさん
19/07/18 22:31:51.56


938:PnG1z3PK.net



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

940:デフォルトの名無しさん
19/07/19 00:50:19.02 CNkXpMDT.net
>>911
というかお前もそうだが、onigmo使ってるなら何で試して動作報告してくれないんだ?
そういうところがRubyのコミュニティはおかしいんだよ。
「みんなで前に進む」という感覚がない。
ちなみに
> 鬼車の中の人と Ruby の間の確執がなければとっくの昔に実装されていたのだろうかと思ったり思わなかったり。
> URLリンク(qiita.com)
これって何?知ってたら教えてくれれば助かる。

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

942:デフォルトの名無しさん
19/07/19 03:16:00.34 CNkXpMDT.net
>>912
自己レスだがだいたい分かった。
その他はリンク切れが多くて詳細までは追えないが、どうやら、勝手に使ったことに対して怒っているらしい。
URLリンク(kkos.hatenadiary.org)
が、ライセンス違反でなければ勝手に使え、というのがBSDだし、
告知しなかったことに関してはRuby側が悪いわけでもない気がするが。
ただこれなら鬼車にはRubyバグを作り込む必要がないから芽がある気はする。
そして文句を言ったところで鬼雲にフォークしてマージしたのなら実質大して変わらない気もする。
よく分からん所で喧嘩してるなとは思う。

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

944:デフォルトの名無しさん
19/07/20 15:46:35.52 KXtQuYxh.net
本当にプログラマなのかな

945:デフォルトの名無しさん
19/07/20 17:29:27.69 AFOF1ubv.net
JS


946:です 「はい」「はい」 「うん」「うん」 「■●」「■●」 「△◎」「△◎」 など、同じ文字列2回(あるいは2回以上)の繰り返しを探すにはどうすればよいでしょうか? /「(.+)+」/ とかだと、1回目と2回目が違ってもヒットしちゃいますよね…?



947:915
19/07/20 17:31:58.05 AFOF1ubv.net
>>917
例を全部2文字にしちゃいましたが、 .+ と書いているとおり別に文字数は関係ありません

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

949:デフォルトの名無しさん
19/07/20 17:45:51.81 kkJ7q95a.net
>>917-918
URLリンク(qiita.com)

950:デフォルトの名無しさん
19/07/20 20:12:32.11 AFOF1ubv.net
>>920
3つ目の
# 重複文字列の抽出にも応用できます
pry(main)> '東京都日野市日野市ほげほげ'.match(/(.+)(\1)/)
=> #<MatchData "日野市日野市" 1:"日野市" 2:"日野市">
ですね、ありがとうございます…!

951:デフォルトの名無しさん
19/07/21 20:31:55.31 Bdf0kkIf.net
>>914
URLリンク(kkos.hatenadiary.org)
松本氏はrb_enc_mbclen()のインターフェースが不適切であるという指摘に対して、何故、その原因を私に責任転嫁したのでしょうか?
rb_enc_mbclen()のインターフェースが不適切になっている本当の理由は何でしょうか?

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

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

952:デフォルトの名無しさん
19/07/22 01:27:11.95 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:デフォルトの名無しさん
19/08/01 15:57:12.21 BVNOJ7mG.net
>>791やってくれる人はいないか~
2ch全盛期なら誰かしらやってくれた可能性高いけどすっかり寂れたな
onigmoに興味があるならtakata氏の日記を読破してみてはどうかな
作りながら考えてたことが分かって面白かったよ

954:デフォルトの名無しさん
19/08/24 12:41:17.80 fR0bFJ1E.net
perlで
(?<=(aa|bb))c
ならokだが
(?<=(aa|bbb))c
だとVariable length lookbehind not implementedになるの納得いかないなー
確かに戻り読み部分の長さに複数の可能性があるけど明らかに有限じゃん
秀丸のHmJre.dllだと通るようだ

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

956:デフォルトの名無しさん
19/08/25 15:17:23.04 GRZE+Rz9.net
(?<=aa|bbb)c

957:デフォルトの名無しさん
19/09/01 12:33:19.59 fodjUzDJ.net
JS(ES2017)です
「貫樣」みたいな、中国語でしか使われないような怪しい漢字を弾きたい
(日本語で使われる漢字のみ許可したい この場合は「貫」だけ残して「樣」は消したい)
のですが
CJKとか言って一緒くたになっている以上、Unicode範囲指定などで判別することはできないですかね…?

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

959:デフォルトの名無しさん
19/09/01 13:31:25.10 kCJZVLuH.net
URLリンク(www.shuiren.org)

960:デフォルトの名無しさん
19/09/01 13:35:35.35 kCJZVLuH.net
ねむい
URLリンク(kanji.zinbun.kyoto-u.ac.jp)
URLリンク(kanji.zinbun.kyoto-u.ac.jp)

961:デフォルトの名無しさん
19/09/01 18:46:39.31 VXfAHt8z.net
>>929
樣は様の旧字で現在でも許容字体扱いだから「常用漢字表」にも
出て来る。
URLリンク(ja.wikipedia.org)
>930-931みたいなのはあくまでコンピューター用のコードの
まとまりの話だから常用漢字か否かは区別していない。
上のリンクのウィキの本表をエクセルにコピーして2列目の
通用字体だけを残して改行を消してやり、それと平仮名や
記号を除外規定にして残り全部消すとかなら正規表現だけでも
さっさと終わるんじゃないかな。
JISの範囲内だけがほしいならシフトJISで保存したら他は
疑問符になるだろうからそれをまとめて削除したらおしまいだろうが
繁体字の樣は残る。簡体字の[木羊]


962:は消える。



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

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

965:デフォルトの名無しさん
19/09/01 22:50:02.12 8GDP8quV.net
RE2 regex とか RE2 正規表現 とかでググれば

966:デフォルトの名無しさん
19/09/10 22:48:57.92 CokwQGf+.net
直前の文字が1回以上出現することが確実なケースで、仮に0回の出現として考慮しても問題がないという場合に、
+ではなく*で正規表現を記述する理由はありますか?
例えば、慣例として*のほうを使うとか、*とするとマッチしない場合のみ+を使うとかそういう

967:デフォルトの名無しさん
19/09/10 23:21:08.02 1dbF51qB.net
0回も許容するなら+ではなく*にする理由は0回も許容するからとしか

968:デフォルトの名無しさん
19/09/10 23:26:41.78 L5QX1JAH.net
具体例で示してくれんとなんか曖昧でよくわからんね

969:デフォルトの名無しさん
19/09/11 12:05:55.89 zFEVPQj4.net
>1回以上出現することが確実なケース
>仮に0回の出現として考慮しても問題がない
矛盾してるな

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

971:デフォルトの名無しさん
19/09/11 16:12:55.15 h8Pfy2ne.net
>>764

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

973:デフォルトの名無しさん
19/09/12 04:33:29.68 +6m2JHnd.net
別におかしな質問じゃないだろ

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

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

976:デフォルトの名無しさん
19/09/12 09:22:01.93 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:デフォルトの名無しさん
19/09/12 10:00:21.41 bJPykHLq.net
わかりやすいように、できるだけそのまま書くならこうかな
●検索文字列
(id="|\G )((\d+[A-Z]\d+))[a-z]
●置換文字列
\1\2

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

979:デフォルトの名無しさん
19/09/12 10:30:50.86 TOasMGF3.net
>948
出来ました!
ありがとうございます。
田中哲スペシャルっていうやり方なのでしょうか

980:デフォルトの名無しさん
19/09/12 11:08:37.62 bJPykHLq.net
\Gは照合開始位置と呼ばれる物で、マッチした箇所の後の境界にマッチしてくれるので
さっきのように(特定の文字列or前回置換しところ)の後に置換したい文字列があるときとかに便利で定番
田中哲スペシャルは\gで同じ表現をもう一回使うって奴だから違うかな

981:デフォルトの名無しさん
19/09/12 11:58:31.87 TOasMGF3.net
>950
勉強になります。
ちなみに最初の値にはアルファベットがついてないケースだと拾えなかったので


982:すが id="97B22 95D18a 93B22c 93E23b" 対応策ありますでしょうか?



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

984:デフォルトの名無しさん
19/09/12 15:04:33.55 bJPykHLq.net
>>951
自分でも書けない訳じゃないみたいだし、魚を与えるより釣り方を教えよの精神でヒント
変更のない置換後でも\Gは引っかかるので、小文字がないidも全部マッチするようにすれば
こういうのを後出しされるとお互い二度手間だから
質問するときはパターンを網羅的に書いといた方が良いよ
あと>>952が指摘してくれたように誤爆が懸念されるので、\Gを\G(?<=.)にした方が良いかもしれない
●対象データが正確で、実際の対象もidのみが載ったリスト形式みたいなものなら要らないけど

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

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

987:デフォルトの名無しさん
19/09/12 21:50:17.55 Jdu1U3XN.net
そこにソースがあるから登るんだ。

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

989:デフォルトの名無しさん
19/09/12 22:56:30.12 Yy9Clfy1.net
自分が参考にしたのはここだったかな
URLリンク(fussy.web.fc2.com)
実装の仕方がある程度分かれば鬼車の作者さんのブログ(rubyの一件以前の記事)も参考になると思う

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

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

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

993:デフォルトの名無しさん
19/09/13 10:47:34.78 wKEqF87n.net
955
URLリンク(codezine.jp)
URLリンク(tociyuki.hatenablog.jp)
URLリンク(hellocode.jugem.jp)

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

995:デフォルトの名無しさん
19/09/13 12:02:22.73 KuW4wLhZ.net
ちょっと違ったりします

996:デフォルトの名無しさん
19/09/13 13:25:46.31 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
19/09/13 13:43:10.59 8XwQqyT8.net
>>965
修正
>ただし、同じ行に、id="~" が複数あると、バグる!
大丈夫だった。正常に動く

998:デフォルトの名無しさん
19/09/16 02:45:59.31 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:デフォルトの名無しさん
19/09/16 02:59:29.74 /xGIA7r1.net
正規表現を使えないなら文字列操作でやればいいだけ
正規表現を使いこなせてない人が使うとバグの温床になるからお勧めしない

1001:デフォルトの名無しさん
19/09/16 07:18:26.85 m2l8x1P1.net
>>967
.split(' ', 2)

1002:デフォルトの名無しさん
19/09/16 12:07:55.69 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:デフォルトの名無しさん
19/09/16 15:25:40.41 YU5GpdCi.net
JSでは、
["30", "8 year old humans"]
ではなく
["30","8"]
となる
limitは、分割結果の制限であり、見つかった要素の数をそこまでで打ち切る

1004:968
19/09/16 15:36:25.96 oN5KVYJd.net
>971
えー!!

1005:デフォルトの名無しさん
19/09/16 15:52:31.08 YU5GpdCi.net
>>972
URLリンク(developer.mozilla.org)

1006:デフォルトの名無しさん
19/09/16 16:04:28.98 2suJbq8i.net
matchじゃなくてsplitで
str.split(/(?<=^\d+) /)

array = str.split(" ");
array[0] + array.slice(1).join(" ")
とかじゃない?

1007:デフォルトの名無しさん
19/09/16 16:06:13.84 2suJbq8i.net
間違えた
下の最後こうか
[array[0], array.slice(1).join(" ")]

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

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

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

1011:デフォルトの名無しさん
19/09/16 17:20:26.44 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:デフォルトの名無しさん
19/09/16 17:34:55.93 hRvCpxCQ.net
>>978
そう言うのは質問者に適宜やってもらえば良い
絶対マッチするという前提かもしれないし

1013:デフォルトの名無しさん
19/09/16 17:40:28.59 enU8we0d.net
>>971
知らなかった

1014:デフォルトの名無しさん
19/09/16 18:09:34.33 enU8we0d.net
const str = '30 8 year old humans'
(([first, ...rest]) => [first, rest.join(' ')])(str.split(' '))
//=> ["30", "8 year old humans"]
あ、正規表現がねぇw

1015:デフォルトの名無しさん
19/09/16 20:46:14.05 RGmahsTZ.net
.split(/ (.*)/,2)

1016:デフォルトの名無しさん
19/09/16 22:28:40.71 enU8we0d.net
次スレ立てたんだけど、
Regular Expression(正規表現) Part15
スレリンク(tech板)
テンプレ貼ってたら>>3 がNGワードとやらで貼れません。
というわけであとよろしく。

1017:デフォルトの名無しさん
19/09/17 10:37:10.53 aFTX7+W5.net
>>984
>>3
のテンプレにある
【 初心者 】 正規表現 【 入門 】 ←閉鎖
http://funcchan.blog16.fc2.com/
5ch では、fc2 は、宣伝禁止かも!
これは、半角で書き込めないので、全角に変換した
このURL を削除すれば?
MANGO 板で、NG ワードを調べられる

1018:977
19/09/17 12:02:24.99 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:デフォルトの名無しさん
19/09/17 16:12:25.16 sjKTVv5w.net
amazonもダメみたいだね、本の紹介しようとしたら弾かれた

1020:983
19/09/17 17:07:52.35 aFTX7+W5.net
Amazon も、半角で書けないだろ
一番恐ろしいのは、はてなブログ!
書き込み禁止画面が出ずに、いきなり吸い込まれて、アクセス禁止にされる!
同様に、twitter の長いURL も、吸い込まれるものがあるらしい!
5ch で、しつこく宣伝する香具師をはめるために、いきなりのアク禁!
MANGO 板に書き込んで、何がNG ワードが、地道に判定していくしかない

1021:デフォルトの名無しさん
19/09/17 17:46:48.25 +bGUkqkJ.net
test
URLリンク(www.ama%7Aon.co.jp)

1022:デフォルトの名無しさん
19/09/17 17:53:38.97 Xou3E6HC.net
はてブのURL、5ちゃんに書けないのか。気づいてなかったわ。

1023:デフォルトの名無しさん
19/09/17 17:56:58.73 +bGUkqkJ.net
test
URLリンク(d.h%61tena.ne.jp)

1024:デフォルトの名無しさん
19/10/02 17:34:34.60 dOlpIXop.net
U . M . E

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

1026:
19/10/12 20:46:20 osgjxuFW.net
改行無視のオプション+<>の間を取得して改行を空白に変更でどう?

1027:デフォルトの名無しさん
19/10/12 22:51:54.37 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:デフォルトの名無しさん
19/10/13 01:09:33.88 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:
19/10/13 01:37:59 5y3mzviq.net
>>996
コピペしたら元データに行末スペースが入ってたからそうしたんだけどこれは5chの仕様なのかな?
行末スペースがないなら空文字じゃなく半角スペースに置換だね

1030:
19/10/13 03:33:31 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:デフォルトの名無しさん
19/10/13 07:48:23.30 0NSyRtEU.net
>>994-996
皆さんありがとうございました。
後方参照をさらに置換すれば良かったんですね。そんな方法があったとは!!
助かりました。

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

1033:
19/10/13 22:05:59 w1EMiXuT.net
VScodeの正規表現検索、置換はjavascriptだろうか?

1034:
19/10/13 22:42:48 5y3mzviq.net
>>1001
ripgrep

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

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


最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch