正規表現道場 Part2 (393レス)
上下前次1-新
94: 2014/01/26(日)23:09 ID:??? AAS
ここはもう荒らしの本拠地になってるから仕方がないよ。
わざわざ煽りにム板まで出張してきてるし。
95: 2014/01/27(月)00:48 ID:??? AAS
こちらは精神異常者の隔離スレとなっております
96: 2014/01/27(月)05:05 ID:??? AAS
じゅんじゅんのきまぐれ
外部リンク:d.hatena.ne.jp
おや、あわわさんとやらが俺の代わりに知らせに行ってくれてたのか。
あわわさん乙。ありがとう。
正規表現 Part11
2chスレ:tech
ってあれ?あわわさんのほうが6時間早い。CPU時計の時差?
97: 2014/01/29(水)03:59 ID:??? AAS
レベル高いスレにただいま。
98: 2014/01/29(水)04:05 ID:??? AAS
荒らしの住み処
ただのクソスレ
99(1): 2014/01/29(水)05:11 ID:??? AAS
ところで向こうの267は雑技たんなのかな?266、雑技のネタに使ってもよかですたい。
100(1): 2014/01/29(水)08:45 ID:??? AAS
>>99
当たりw
266の書き方は考えたけど,今回のケースでは267の書き方で大丈夫と考えた.
そういや質問者は「1」を含まないって書いてあるのに,なぜ「123」? とは思ったなw
後ろに他の正規表現を続けたりするとバックトラックして,
271の通りの可能性があるから初心者には266の方がいいのは確か.
ただ,他にもいろいろ考え出すと,最も内側のものだけ削除したいのなら,
ABC(?:(?!123|ABC|DEF).)*DEF
と書いた方がいいとかもある.
ちなみに266のミソは↓の辺りで微妙に使っていたりする.
省1
101(1): 2014/01/29(水)15:23 ID:??? AAS
>>100
ああ、考えてみればABCも入れたほうがいいね。質問者の対象データが対になってる
データだったから必要性を感じなかったが入れるべきだった、さすが雑技たん。
>なぜ「123」?
1というのは実データとは違う省略形と考えた。
初心者には文字と文字列の違いが分からないから文字列のつもりで1と書いてしまった
可能性がある。そこで文字列に対応しておけば1文字にも対応出来るってわけ。
>ABC(?:(?!123|ABC|DEF).)*DEF
これが基本形やね。高速化するなら*+とか、もっとやるなら[^1AD]*+使ってごちゃごちゃ書いたり。
>NoEnd
省2
102(1): 2014/01/30(木)00:29 ID:??? AAS
>>101
>1というのは実データとは違う省略形と考えた。
なるほど.確かに,初心者ほど状況説明が下手だからね.
>それと <\2> だと <font> になってしまうで・・ <\2\b やね。
単純なミスだな.指摘ありがとう.
103(2): 2014/01/30(木)07:11 ID:??? AAS
・範囲内で文字列を含まない正規表現
$_ = "zzzABC XYDEFzzDEFz";
if ( m/
# Perl 5.10 以降で有効
ABC
[^XAD]*
(?:
(?!XYZ|ABC|DEF).
[^XAD]*
)*
省10
104(1): 2014/01/30(木)13:46 ID:??? AAS
修正乙の後でアレなんだけど、実際に動かしてみたらだいぶおかしいから手直ししてみたよ、と。
while ($html =~ /
<(NOBR|CODE|B|PRE|FONT)\b
(?=
(
(?:(?!<\/\1>).)*?
(?:<\1\b|$)
)
)
/sixg
省7
105(1): 2014/01/31(金)02:30 ID:??? AAS
>>103
(*VERB:ARG) ってのは知らなかったなぁ.
今回のケースだと(*PRUNE)は(?>pattern)で置き換えができると思うが,
マニュアルの 「(*PRUNE) は (?>pattern) 単独では表現できないケースを扱うために使えます。」ってのがどういうケースなのか想像できん.
>>104
修正ありがと.
元のやつだと後ろを吸い込んじゃうからマッチ位置が先に進んでしまう.
そうならないように先読みを使うと,先読み部分は後方参照に含まれなくなるから,先読みの中で改めて補足が必要って感じだね.
106(1): 2014/01/31(金)04:37 ID:??? AAS
>>105
>単独では
・・・ ( ・・・ (*PRUNE) )
みたいに ( ) で分断されてる場合とか? (?> だと2つ以上必要になる。
>マッチが先に
当たり〜。printのとこは""の中にまとめて書いても大丈夫だったのか、勉強になりますた。
改めて修正乙。
107(1): 2014/01/31(金)10:29 ID:??? AAS
>>103
「XYZとDEFの競合」ってのはXYZの後半部分がDEFの前半部分と同じ場合ってことかな?
例えば,xydとdef,とか,xdeとdefみたいな
もしそういう,後半部分と前半部分が重なる場合を考え出すと,話がもう少しややこしくなる.
つまり,ABCDとCDEFがキーだったときに,ABCDEFという文字があったら,
それはABCD+EFと解釈するのか,AB+CDEFと解釈するのか,という問題.
その解釈がすべて前方優先なのか,すべて後方優先なのか,それともキーの相互の優先度で決まるのか,
あるいは,あらゆる可能性を許すのか,あらゆる可能性を許さないのか.
キー自身が重なる場合もある.
例えば,ABCABみたいなキーだったとき,ABCABCABは,ABCAB+CABなのか,ABC+ABCABなのか.
108(1): 2014/01/31(金)10:34 ID:??? AAS
>>106
>・・・ ( ・・・ (*PRUNE) )
なるほど,括弧の深いところで使うと,(?> で表現するのは大変そうだ.
しかも,もしそれが中間レベルで分岐してたりすると,(?> では表現しきれないかな.
109: 2014/01/31(金)16:13 ID:??? AAS
>>107
ぶっちゃけその辺は何も考えてない。試作品とかテンプレートみたいな感じで作っただけ。
競合対策の部分は普通の使い方をするならいらないね、HTMLやXMLタグで挟まれた文字列にマッチさせるときとか。
こういうの以外に使い道が思い当たらないし。(だったら付けるな)
>>108
>分岐
なるほど、(?> ではお手上げだ。俺も年末に覚えたばかりでよく分かってない。
110: 2014/02/01(土)16:48 ID:??? AAS
## (*COMMIT)
$_ = "12";
if (
m/^1((*COMMIT)3|2)/
){ print "match!\n"; }
# 分岐の中で踏まれると以後ほかの分岐要素を走査することがなくなる。
# 現在の分岐要素がマッチ失敗したら全体もマッチ失敗となり検索はそこで完全終了する。
m/^1(*COMMIT)(3|2)/
# 下位層の分岐は走査され、マッチが成功する。
$_ = "12";
省5
111(1): 2014/02/01(土)17:24 ID:??? AAS
Q、(*COMMIT) とは逆にマッチが成功したときだけ /g を止める最も簡単な手段は何か?
$_ = "123";
@test = $_ =~ m/1|2|3/g;
print "@test\n";
↑2 がマッチ成功したときに /g を止め、3がマッチしないようにする。
フラグ変数を用意、チェックすれば可能だがもっと手軽な手段はないか。
112(2): 2014/02/02(日)07:59 ID:??? AAS
う〜ん、/g はループなのに break する方法が用意されていない。
COMMIT があるのにこれがないのはとても不可解だ。
# 先読みの中の (*SKIP) は機能しない。
@test = $_ =~ m/1|2(?=.*(*SKIP))|3/g;
# while 文の last を使う。
$_ = "123";
while ( m/1|2|3/gp )
{ print "${^MATCH}\n";
last; } # 1 で止まる。
# (?{code}) で last → 効果なし
省4
113: 2014/02/02(日)08:47 ID:??? AAS
# (?-g) → 効果なし
while ( m/1|2(?-g)|3/g )
# 苦肉の策 (現実的でない)
while (
m/(1)|(2).*|(3)/g
)
{ print "${^N}\n"; }
# 苦肉の策 + 最後の空文字列にマッチしない対策 (現実的でない)
while (
m/\z(*COMMIT)(*F)|(1)|(2).*|$/g
省2
上下前次1-新書関写板覧索設栞歴
あと 280 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル
ぬこの手 ぬこTOP 0.018s