[過去ログ] Regular Expression(正規表現) Part16 (1002レス)
上下前次1-新
このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
955: 2023/11/15(水)18:12 ID:ctqB5947(1) AAS
/^abcdefg/
956: 2023/11/15(水)18:41 ID:/mJ+eeiZ(1) AAS
無いんじゃないか?
^(?:abcdefg|abcdef|abcde|abcde|abcd|abc|ab|a)
とどっちがマシかな
957(1): 2023/11/16(木)14:47 ID:7i/8qZTv(1/2) AAS
/^m/ にマッチして map だけマッチして欲しくない
/^m[^a][^p]/ これだと man にマッチしてくれない
どう書けばいいですか
958: 2023/11/16(木)14:53 ID:4tHpE5Jq(1) AAS
>>957
否定先読みが使えるなら^m(?!ap)かな?
959: 2023/11/16(木)15:59 ID:7i/8qZTv(2/2) AAS
ありがとう
960: 2023/11/17(金)04:25 ID:gwXFy+9L(1) AAS
特定の文字列を検出したい場合、\Q~\Eの~に、その特定の文字列を入れておけば、どんな文字が来ても大丈夫でしょうか?
961: 2023/11/17(金)06:13 ID:28WV0iMa(1) AAS
\Eが来ると困る
962: 2023/11/28(火)12:33 ID:vIU65Zk5(1/5) AAS
正規表現スレがいいと聞いてきました
ここがいい正規表現すれですか?
$ perl -e '$a="abc"; $a =~ s/(.*)/[$1]/g; print $a . "\n"'
[abc][]
なんで後ろにカッコが来るん?
.*に全部マッチするんだから
二個目の[]が来るなんてお菓子にゃん?
963(1): 2023/11/28(火)13:42 ID:EkqG9ePT(1) AAS
perlよく知らんがgとったら消える
964(1): 2023/11/28(火)13:54 ID:uy7CvN4q(1/3) AAS
推測だが、
1) .*にabcがマッチする -> [abc]
2) .*は0個でもいいので、末尾位置(NUL)にマッチする -> []
965(1): 2023/11/28(火)14:25 ID:uy7CvN4q(2/3) AAS
2回目は$a=""の場合と同じだと思えばいい
ヌル文字列でも.*だとマッチするでしょ?
966: 2023/11/28(火)16:18 ID:vIU65Zk5(2/5) AAS
>>963
gとったら消える。Rubyも同じらしい。
>>964
[]が出るってことはなにかにマッチしてるってことでしょ?
>>965
それなら最初の.*にもマッチするじゃん?
一回目にマッチしなくて、二回目にマッチする理由がわからんのよ
967: 2023/11/28(火)16:18 ID:JJPCdnVt(1/2) AAS
仮に2回目でマッチする何かがあったとしても
.*はgreedyなんだから1回目で消費してないとお菓子イイ
968(1): 2023/11/28(火)16:20 ID:JJPCdnVt(2/2) AAS
でもなぁ
バグなら今までこんなん気が付かないはずないと思うからどうなんだろ
969: 2023/11/28(火)16:21 ID:vIU65Zk5(3/5) AAS
$ perl -e '$a="abc"; $a =~ s/(.*)$/[$1]/g; print $a . "\n"'
[abc][]
$ perl -e '$a="abc"; $a =~ s/(.*$)/[$1]/g; print $a . "\n"'
[abc][]
後ろに$入れても同じ
行末以降の何にマッチしてんのこれ?
970: 2023/11/28(火)16:22 ID:vIU65Zk5(4/5) AAS
Rubyのコードも持ってきた。持ってきただけだから意味は知らん。
ruby -e 're=/(.*)/; puts %Q(abc).sub(re){ %Q([#$1]) }'
[abc]
ruby -e 're=/(.*)/; puts %Q(abc).gsub(re){ %Q([#$1]) }'
[abc][]
971(1): 2023/11/28(火)16:44 ID:wVUnEJO+(1) AAS
ググってみたがperlのそういう”仕様”として定着してるみたいだな
引っかかったことなかったわ
972(1): 2023/11/28(火)16:47 ID:uy7CvN4q(3/3) AAS
>>968
1回目の.*で文字列全体がマッチ、2回目でNUL文字列にマッチするのは
どの正規表現環境でも同じだと思うよ
973: 2023/11/28(火)16:49 ID:CppHkuHl(1) AAS
0文字と一致させたくなければ.*ではなく.+と書けよ
974: 2023/11/28(火)16:59 ID:fB6/42vV(1/2) AAS
>>972
Perlの文字列はNull Terminatedされてないよ
/gだとマッチできないか再度確かめるからzero-lengthのempty stringにマッチするんだとさ
でも同じ位置でempty stringに2回はマッチしないようなチェックが入ってるからそこで抜けるんだとさ
個人的にはバグだと思うけどPCRE準拠でみんな作ってるから同じ動きをさせたんだろうね
regex101で試すとRustだけが一般に期待する動作をしてる
975: 2023/11/28(火)17:02 ID:fB6/42vV(2/2) AAS
/(.*)$/みたいに末尾のアンカー入れても結果変わらないから余計におかしい
^を入れたら当然防げるけど
976: 2023/11/28(火)17:09 ID:vIU65Zk5(5/5) AAS
>>971
探したけど見つからんかった。
どこにあった? or どうやって探した?
キーワードがわからん
977: 2023/11/28(火)18:08 ID:waKUlTL5(1) AAS
これは長さゼロでマッチした直後に長さゼロにマッチしてposが進まなかったときにマッチを終了するという、頭の悪い正規表現を書くマヌケのために配慮された動作が例外的なんだよ
そのおかげで頭の悪い正規表現を書いても無限ループさせずに済んだことにむしろ感謝するべきだね
978: 2023/11/28(火)18:30 ID:mMoqXMUf(1) AAS
(ハクション!
979: 2023/11/28(火)19:16 ID:6l9rHssS(1) AAS
単に便利だからゼロ幅マッチさせてるん
$str =~ s/()/$1,/g; やってみるといいのん
980(2): 2023/11/29(水)13:08 ID:yvH2v9xT(1/2) AAS
正規表現検索は失敗しないかぎり終わらないって話では
abcに対して(.*)$が検索される→「abc+末尾」がマッチ、この時点での位置はcの後ろのゼロ幅
残りの部分に対して再度(.*)$が検索される→「ゼロ幅+末尾」がマッチ、cの後ろのゼロ幅が消費される
残りの部分に対して再度(.*)$が検索される→対象を消費しきっているので失敗→検索終了
981: 2023/11/29(水)14:41 ID:lw8jVmFR(1/3) AAS
そういうもんだと思って使ってたわ
それをバグだと思ってる人がいてびっくりぽんや
しかしこういうことに疑問を持つ人は今後伸びるで
982: 2023/11/29(水)17:53 ID:AoutXZD6(1) AAS
>>980
その理屈で言えば1回目で対象を消費しきってるから2回目が失敗するべき
1回目で消費しきっているにも関わらず2回目のゼロ幅マッチが成功するなら3回目のゼロ幅マッチだって成功するはず
そうならないのは対象を消費しきってるかどうかを確認せずにマッチを実施しており最終的には2回連続同一箇所でのゼロ幅マッチという失敗条件に合致してはじかれているから
983: 2023/11/29(水)18:01 ID:lw8jVmFR(2/3) AAS
確かにその通りやな、1度目で消費しきっとるはずや
984: 2023/11/29(水)18:06 ID:lw8jVmFR(3/3) AAS
分かったつもりになってるだけで全然分かってへんのがおるから
ちゃんと本か何かで学習したほうがええで、今までそういう学習をしてへんやろ
上下前次1-新書関写板覧索設栞歴
あと 18 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル
ぬこの手 ぬこTOP 0.021s