[過去ログ] Regular Expression(正規表現) Part14 [無断転載禁止]©2ch.net (1002レス)
1-

このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
803
(2): 2019/04/23(火)07:05 ID:k/th3sVe(1/2) AAS
>>801
sed ':r; s/1[0-]\([0-]*1\)/11\1/; tr'

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

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

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

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

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

str = "x10-0y0-1x"

# $1 は、capture 部分で、0-0y0-。この部分を置換する。
# 結果は、x1 (111y11) 1x
p str.sub( re ) { |s| "1" + $1.gsub( /[0-]/, "1" ) + "1" }
809
(2): 2019/04/23(火)12:38 ID:ef59e0DS(3/5) AAS
>>807
反論と取られたのかな
反論でも賛意でもないよ

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

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

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

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

と言う話しかしてないのであしからず。
813
(1): 2019/04/23(火)13:54 ID:yIB0exXp(4/6) AAS
>>809
というか、そもそもお前宛じゃないのに
なんでお前が絡んで来てるのか謎。
勝手にお前が批判されたと妄想するなよ。
814
(1): 2019/04/23(火)15:45 ID:ef59e0DS(4/5) AAS
>>813
> というか、そもそもお前宛じゃないのに
ふあ?
>>807ID:yIB0exXp)で>>806ID:ef59e0DS)に安価されてるからですよ
んーなんなんかな(´д`)
815
(1): 2019/04/23(火)17:14 ID:yIB0exXp(5/6) AAS
>>814
>>805のことだが。
お前宛じゃないのに絡んで来たのお前だろ。
記憶喪失ワロタw
816: 2019/04/23(火)19:20 ID:GneiHx9I(1) AAS
まーまー、ここはわしの顔を立てて双方おとなしくしてくれまいか。
817
(2): 2019/04/23(火)19:41 ID:ef59e0DS(5/5) AAS
>>815
あーきみがいいたいのはそっちか
例題をこなす正規表現を提示している>>803,804宛と捉えたんだよね
すでに>>803,804出てるのになにも提示してないでぐちぐち言ってるんで

まあ気に障ったようなので安価張って絡んだ形になったのは謝るよ
818: 2019/04/23(火)19:46 ID:yIB0exXp(6/6) AAS
>>817
>>805>>801宛だと明示してるし
>>803>>804なんてどこにも書かれていないのに勝手に勘違いされてもさあ。
どこをどう見たってお前が勝手に絡んで来てるのに
「絡んだ形」とかふざけた言い方すんなよ。
819: 2019/04/24(水)19:37 ID:kN2xWSes(1) AAS
質問者の例題は数に応じた置換の簡単なサンプルが欲しくて書いたものだと思う
再帰的に無理やり導くクソコードなんて書かれても迷惑なだけでしょ
820: 2019/04/24(水)21:35 ID:SVxlletW(1) AAS
端からは大人と子供
ご愁傷様
821: 2019/04/25(木)02:00 ID:nkf4NYVZ(1) AAS
pythonスレで似たテーマ観たからマルチ認定
822: 2019/04/26(金)22:15 ID:pXwlHtT3(1) AAS
sedとpythonじゃまるで違うから別件だろうな

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

というかこの文体、昔セガBBSにいた南瓜さんという人にそっくりだな
別人だろうけど思い出してワロタ
823: 2019/04/26(金)22:34 ID:7hEPz6dq(1) AAS
しばらくぶりにノゾいたらワロタ

ID:yIB0exXp
外部リンク[html]:hissi.org

平日の朝から晩まで
内容がとっても抽象的
ネット弁慶クンってホントにいるんだな!w
824: 2019/04/26(金)23:09 ID:DINb0EDe(1) AAS
マ板恒例、湿度高めの展開になってきましたー
825: 2019/04/27(土)13:12 ID:W9D3URJl(1) AAS
オブジェクト指向最高さんは今回まったく落ち度が無い
迷惑かけといて素直に謝ることも出来ないくそコード製造機はもう来なくていい
826: 2019/04/27(土)21:25 ID:CxhHumup(1) AAS
翌日以降もこんな感じですよ
外部リンク[html]:hissi.org
外部リンク[html]:hissi.org
外部リンク[html]:hissi.org
外部リンク[html]:hissi.org
こちらで引き取ってもらえませんか?
827: 2019/05/04(土)22:49 ID:Wy3P56AZ(1) AAS
引き取ってくれてありがとう〜(^。^)
828
(1): 2019/05/29(水)23:29 ID:NoMeOMsF(1) AAS
よろしくお願い致します。

●Regular Expressionの使用環境
Python 3.7

●検索か置換か?
検索

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

●対象データ
"文字列1":[1000:"文字列2"]
省2
829
(2): 2019/05/30(木)07:22 ID:NTWA4E5y(1/2) AAS
>>828
Javaの正規表現テストサイト(*1)でしか試してないけど…
(?:[^"]*"){3}([^"]*)"

*1 外部リンク:regex-testdrive.com
830
(1): 2019/05/30(木)08:48 ID:ZbLZAkBS(1) AAS
>>829
文字列1が空だと空振るのでいっそベタ書きするかな
それと対象の規模によっては計算量も30%少なくて済む
"[^"]*"[^"]*"([^"]*)"

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

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

●検索か置換か?
検索

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

(?<=[a-zA-Z]+).
省6
838
(1): 2019/06/17(月)02:22 ID:FPrxRapn(1) AAS
(?<=[a-zA-Z])[^a-zA-Z]
839
(1): 2019/06/17(月)06:40 ID:LXSfy5ij(1) AAS
>>837
> 「全角英字の単語直後の任意の1文字」

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

> 「う」、「え」の2か所
任意とは
840: 2019/06/17(月)21:52 ID:ks+4WGLz(2/2) AAS
>>838
天才!天才!解決しました。大量に感謝
発想が . に囚われていた……勉強になります

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

(レス不要です)
842: 2019/06/19(水)05:02 ID:tVNS+22r(1) AAS
【出資】松本卓朗 人工知能詐欺【注意】
2chスレ:rikei
843: 2019/06/19(水)14:27 ID:Yoy0IPRe(1) AAS
いし正が左らか右は語本日
844: 2019/06/23(日)22:51 ID:WHM6Ibwm(1) AAS
>>834
理論上は
|
で全部やればできる

ちょうど単なる全角(
1文字が2つの幅をもつ
ロシアの言語なども2幅
)
を捉えようとしていたので道具を紹介
画像リンク[jpg]:i.imgur.com
省2
845: 2019/06/24(月)06:26 ID:F4CLQWNj(1) AAS
外部リンク[htm]:so-zou.jp
こういうので全角記号だけさっくり選ばせろって事なんだろうけど
全角半角はユニコードだとフォント依存なので曖昧
ascii 以外って意味で言ってるんだろうけど
恐らく"ファイル名"て事からSJisの範疇外の文字って事かなと
846: 2019/06/24(月)21:23 ID:4+LiJo6+(1/5) AAS
一文字決めうち かつ あらっぽいコレクション
vim の :h digraphs には結構ある
[??????????▲△??▼▽??◆◇?○◎●??????★☆?????♀♂?????♪?♭?♯??? 、。〃?々〆〇《》]
847: 2019/06/24(月)21:24 ID:4+LiJo6+(2/5) AAS
[??????????▲△??▼▽??◇?○◎●??????★☆?????♀♂?????♪?♭?♯??? 、。〃?々〆〇《》]
848: 2019/06/24(月)21:24 ID:4+LiJo6+(3/5) AAS
[??????????△??▼▽??◆◇?○◎●??????★☆?????♀♂?????♪?♭?♯??? 、。〃?々〆〇《》]
849: 2019/06/24(月)21:28 ID:4+LiJo6+(4/5) AAS
おわった
NG word 群が正規表現を妨げる

一文字限定なら [] の処理が早い
vim の :h digraphs
には 1300個ぐらいの 記号を含むデータリストがあるから
それから組みたてやすい とおもう
850: 2019/06/24(月)21:56 ID:meJBThiE(1) AAS
NGワードと文字化けの区別ができない人は書き込んじゃダメ。
851: 2019/06/24(月)23:17 ID:4+LiJo6+(5/5) AAS
そういえばブラウザに NG word に指定したのは自分だった
あらしが記号を使ってたことがあったので
852: 2019/06/25(火)07:18 ID:0Do2GL77(1) AAS
荒らしが記号を使うことと書き込みを制限することに全く関連が無い
853: 2019/06/25(火)08:36 ID:Y04/VZ6Y(1) AAS
画像リンク[jpg]:i.imgur.com

こう見えていたんだ
左がわひどいね ごめんね
854
(2): 2019/07/08(月)00:38 ID:m6vFYfK4(1) AAS
●Regular Expressionの使用環境
サクラエディタ(か秀丸エディタ)

●検索か置換か?
置換

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

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

●希望する結果
省1
855
(1): 2019/07/08(月)05:29 ID:9IE9wmRC(1) AAS
(?<!^)A=
856: 854 2019/07/08(月)23:27 ID:Rb/08H3f(1) AAS
>>855
ありがとうございます。
否定戻り読みってこうやって使うのですね。

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

■希望結果
A=a,b,c,d
省3
857
(1): 2019/07/10(水)08:43 ID:WA2fRW/e(1) AAS
\s++OR\s++.=
,
858
(1): 2019/07/10(水)09:18 ID:StxWbt+s(1/2) AAS
ここの住民の正規表現能力は超人的だ
お節介させてくれ
もし使用環境に 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
省2
859: 2019/07/10(水)09:35 ID:StxWbt+s(2/2) AAS
そして同じような形を処理するのに
必要な正規表現が大きく変わったりしない

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
860
(1): 854 2019/07/11(木)01:01 ID:/KpWZOtx(1) AAS
>>857
すごい。。
置換できましたありがとうございます。

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

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

Perlでのご教授ありがとうございます。
1度組んでしまえば汎用的に使えそうですね。
861: 2019/07/11(木)21:00 ID:SCYCuKB+(1) AAS
>>860
外部リンク[ja]:github.com
862
(2): 2019/07/13(土)20:47 ID:57lWPs8z(1/3) AAS
動作についての質問です。よろしくお願いします。

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

●検索か置換か?
検索

●説明
'@time;prop1:style1;prop2:style2'.match(/(^|[@;])[^@;]*/g); が
["", ";prop1:style1", ";prop2:style2"] になる理由が分かりません。私の理解では、
["", "@time",";prop1:style1", ";prop2:style2"] となって欲しいところです。
どなたか説明お願いします。
省10
863: 2019/07/13(土)23:13 ID:57lWPs8z(2/3) AAS
正規表現の問題ではなくJavaScript固有の問題のようなので、質問を閉じ、
JavaScriptスレにて質問し直します。
興味のある方は以下をご覧ください。(これからすぐ投稿します)
2chスレ:tech
864: 2019/07/13(土)23:31 ID:57lWPs8z(3/3) AAS
すいません自己解決しましたが一応。以下となりました。
2chスレ:tech
865
(1): 2019/07/14(日)04:59 ID:XILHsvHP(1/3) AAS
この質問内容ならここで合ってます、jsスレよりもこのスレ向きです
正規表現には統一規格みたいなものは存在しないので環境によって動作が異なります

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

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

> このスレの住民なら2番目のマッチが t から始まる環境も想定します
> ["","time", ";prop1:style1", ";prop2:style2"]
これは一応アウトなのでは?正規表現自体はデリミタごと取り込もうとしており、それが出来ていません。
これを言うならJavaScriptもアウトですが。
省8
867
(2): 2019/07/14(日)10:58 ID:wR6d2dgQ(1/2) AAS
PCREに向けて統一中なんてどんな根拠で喋ってんだ
regex101で試してみれば分かるけどPCRE使ってるPHP以外のPython, ECMAScript, Goは全滅だぞ
868
(1): 2019/07/14(日)12:13 ID:LdVrbIxu(2/6) AAS
>>867
ゴミという意味でだろ。
逆にお前はどう思ってるんだ?

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

正しくは RegExp.exec 側を修正し、両方とも無限ループにならずに
["", "@time",";prop1:style1", ";prop2:style2"]
省18
869
(1): 2019/07/14(日)12:35 ID:QmWR+pGh(1) AAS
ゼロ幅で永久にマッチし続けるのになんで@timeに進めると思うの?
870: 2019/07/14(日)13:05 ID:LdVrbIxu(3/6) AAS
>>869
お前は実装と仕様の違いを理解出来てないタイプだな。

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

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

JavaScript界隈にはお前みたいな馬鹿が多い。
省7
871
(2): 2019/07/14(日)13:21 ID:XILHsvHP(2/3) AAS
>>866
"t" からマッチは誤りでした、申し訳ない..

タグの外側だけ対象に置換する
外部リンク[htm]:www.din.or.jp

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

> そこで,Perl では空文字列に マッチするような場合には,初回は空文字列がマッチするがそれ以降は マッチせずに必ず 1文字分は進むようにマッチしようとする.
これも実装ミスだな。
正しくは、このフラグを「空文字以外のマッチごとにセット」すればいいだけで、修正は1行で済むのだが、こちらも今更なのだろう。
「初回は」というのが間違いで、「空文字にマッチした直後は」が正しい。
ついでにもっと具体的に言っておくと、「初回は」というのが正しければ、
今の実装は検索起動時にフラグをセットして空文字マッチ後にリセットしているはず。
このフラグを「空文字以外のマッチ後」に毎回セットし直すように1行入れる。これで直る。
君がPERL等のOSSか何かにcontributeする気があって修正案を出してくるのなら見てあげるけど。
省14
874
(1): 2019/07/14(日)15:13 ID:LdVrbIxu(5/6) AAS
>>867
今更regex101で確認してみたが、PCREだけは(これに関しては)正しく通るじゃねえかよ。

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

>>871
ちなみに
> > と < は後読みと先読みにして外に出すことができるので
の意味分かる?
おそらくはバックトラックを小さくする為(つまり高速化)だと思うのだが、
実際 regex101で試す限り余計に遅くなる。
省4
875
(1): 2019/07/14(日)15:29 ID:XILHsvHP(3/3) AAS
>>874
> > と < は後読みと先読みにして外に出すことができるので

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

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

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

Perl6はガン無視されてる感があるけどね。
今更Perlで組めるかよ、というのはPerlを使っている奴自身が感じていることらしいし。
(もっとも嫌われてる言語がPerl、2017はダントツの一位、
しかし同じStackOverflow実施の2018の結果はVBでperlは落ち着いたようだが)
省8
877
(2): 2019/07/15(月)15:22 ID:y88H95dP(1) AAS
Ruby で、

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

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

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

[ 0 ]がマッチした部分、[ 1 ]がキャプチャー部分
省2
878: 2019/07/15(月)16:42 ID:xqOJLOC2(1) AAS
>>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だ。
省12
879
(1): 2019/07/15(月)23:23 ID:3MPTmFRg(1) AAS
BREの正規表現と今の正規表現の使い方の違いの話は面白いなぁ

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

おかしな挙動と言えばperl5とOnigmoでは\Gの挙動に違いが
あってどちらかが違和感のある動作をしたはず
\Gの概念自体が微妙に違ったはずだけどメモるの忘れた
興味のある人はぐぐってね
880: 2019/07/16(火)15:24 ID:wQsYVdH6(1) AAS
ネット弁慶がイキりたかっただけでしょ
881
(1): 2019/07/16(火)16:08 ID:cpfSTA9t(1) AAS
>JavaScript, Python, Go, Ruby, : ["",";prop1:style1", ";prop2:style2"]
深くて理解できないことが多いが、これはやばい気がする
882: 2019/07/16(火)17:23 ID:hAAouWtx(1/2) AAS
読んでるだけで何も考えてなかったけど

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

この書き方以外の書き方で意図した動作になるように書けないのかな
ここの人はこういうの得意だからもしかしたら・・?
883: 2019/07/16(火)18:30 ID:AvaVqNzm(1) AAS
一所懸命挑発的に書いてるのに全然乗ってもらえなくてかわいそう
884: 2019/07/16(火)19:27 ID:hAAouWtx(2/2) AAS
言ってることに説得力がありすぎて聞き入ってしまってたよ
どんどん言いたいことを言って欲しい
昔のdanさんを思い出すなぁ
885
(1): 2019/07/16(火)20:41 ID:bFMew56o(1) AAS
入力フォーマットが正しいという前提で /@?[^@;]+/ の方が好み
そもそも正規表現使うより ; でsplitした方が良くね?とおm
886: 2019/07/16(火)21:03 ID:hMJFhr7R(1/2) AAS
>>881
深くはない、単にバグってるだけ。
そしてそれはやばいどころではなく、全く話にならないレベルの物だ。使い物にならない。

例えば、図書館の蔵書をユーザーにも検索出来るようにしたとして、正規表現検索も選べるとしよう。
この場合、検索結果に現れないケースが発生することになり、使い物にならない。
プログラミング言語内の正規表現エンジンは「今までのプログラムが動かなくなる」危険があるからそうそう交換出来ないが、
図書館DBの検索フロントエンド内のエンジンなんて即交換可能なんだから、問題があればすぐ乗り換えられる。
PCREが気に入らないのならこんなところで無駄吠えするのではなく、
PCREがバグっているケース(例のタグ外側マッチとか)でもばっちり動く検索エンジンを提供して、乗り換えを待てばいいだけ。
現状、PCRE以外全部バグっているのだから救いようがないが。
省14
887
(1): 2019/07/16(火)21:18 ID:hMJFhr7R(2/2) AAS
>>879
BREの場合はやりきる前提ではないので、例えば例のタグ外側マッチだと、
元の文字列に > と < を足してしまって置換し、出力時に削る、みたいなことをする。
具体的には以下。

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

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

>>885
それは正しい。実際俺もそれに近いことをしている。
省7
888: 2019/07/16(火)22:42 ID:P37s1FHo(1) AAS
一度言った内容は繰り返さなくていいです
889
(1): 2019/07/17(水)08:28 ID:2/Bgill9(1/5) AAS
>>873訂正
俺は俺のケースだけ考えていたが、これだと871内URLの筆者のケースと合致しない。
そこで一応、両方とも合致する実装を考えてみた。
(といってもバグってる実装について推測すること自体はあまり意味がないが)

Perlはおそらく、^のフラグではなくて、空文字マッチ後のそのマッチ区間の*を+にしてる。
(というより筆者もそう言っているのだが俺が早とちりしてしまった)
871のケースだと、正規表現 (?:^|>)(.*?)(?:$|<) に対して、
1回目:(?:^|>)(.*?)(?:$|<)
2回目:(?:^|>)(.+?)(?:$|<)
というわけだ。結果、2回目は「先頭、<含んだ1文字、次の<まで、となり、
省11
890: 2019/07/17(水)08:28 ID:2/Bgill9(2/5) AAS
正しい実装は、「経路全体」(つまりツリーのリーフ)に対してフラグを持たないといけない。
Perlは「区間」(=経路の一部)に対してフラグをつけてしまったところが間違いだ。
871のケース、単純化する為に (A0|A1)B(C0|C1)として、
1回目:A0BC1 で空文字マッチ
そして空文字マッチの場合はこれを記録し、これと同一の場合は次回以降はスキップする。
結果、2回目:最初に A0BC1 がマッチするがこれは捨てられ、次に A1BC0またはA1BC1となる。
そして非空文字マッチとなったので、この記録を全破棄して、同様にループを繰り返せばいい。

実装の修正は、探索関数そのものにだいぶ手を入れないといけないのでそれなりに大変だ。
まずは全部の最終段に「最終チェック」を入れて上記リストと照合、記載有ればマッチ失敗として探索継続、としなければならないが、
おそらくこれが1ヶ所では済まない。
省11
891: 2019/07/17(水)08:29 ID:2/Bgill9(3/5) AAS
なおPerlの実装だと『上位関数のみ』で対策できるため、
「取り敢えず1時間で直せ」と言われたらこうなるのも分からなくはない。
しかしいまだにそのままだというのは怠慢でしかないが。
JavaScript等も同様、『上位関数のみ』で対策出来るところで留まっている点からも、これは言える。
しかし現時点で世界中のプログラマがどれだけ無駄な時間を消費することになっているのかを考えれば、
こんなのは手間であろうがさっさと直せ、でしかないが。

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

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

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

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

OR の部分が、並列ではない。
省1
893
(1): 892 2019/07/17(水)09:51 ID:u050lnGw(2/3) AAS
(^|[@;])[^@;]*

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

A|B
A, B 両方に該当する場合に、A,B どちらの処理がされるのか、あいまい!
894
(1): 2019/07/17(水)09:53 ID:RL7WDafS(1/2) AAS
左側優先とかないのかこれ?
895
(2): 877 2019/07/17(水)10:06 ID:u050lnGw(3/3) AAS
>>889
Ruby で、

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

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

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

[ 0 ]がマッチした部分、[ 1 ]がキャプチャー部分
省6
896
(1): 2019/07/17(水)13:38 ID:FD/sfaX1(1) AAS
小飼って糖尿病で死んだんだっけ
897
(1): 2019/07/17(水)14:01 ID:fOq5lc1d(1) AAS
質問させてください。
PCRE や bregonig で大文字・小文字の区別なしで\x{017F}がsやSにマッチしてしまうのは仕様ですか?
898: 2019/07/17(水)15:07 ID:Jmalh7Yl(1) AAS
>>887
>('>' + str + '<').replace(/>[^<]*</,'>bar<').slice(1,-1)

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

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

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

+ に変えて空文字マッチをなくし、結果、希望の文字列を得る、という運用で回避するのはありだ。
ただ、その場合は、プログラマにそう分かるように、
「Rubyの正規表現エンジンは空文字マッチ周りにバグがあるので、注意してください。
空文字マッチがある正規表現を与えた場合、予期せぬ動作になることがあります。」とアナウンスしないといけない。
事実上空文字マッチが使えないが、事実なんだからそうするしかないだろ。
Rubyはこういう事を全くしないからゴミなんだよ。Rubyは滅ぶべくして滅んで行ってるだけ。
省16
902
(2): 2019/07/18(木)16:11 ID:Y8yxmCyC(1/2) AAS
今の複雑化した正規表現エンジンってエンジンを作った人ですらどう動くのか
予測が難しいところがあるのでは

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

あとrubyの正規表現エンジンは空文字マッチが〜の件は
つまりonigmoのことを言ってるんだけどonigmo自体は空文字マッチに
対応してると記憶してるからrubyモードの仕様なんじゃないかな
1-
あと 100 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル

ぬこの手 ぬこTOP 0.036s