トップページ⇒php
825コメント240KB

正規表現道場@2ch Part2

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん02/11/24 22:57ID:LrbVcl3Y
Perlに限らずスクリプト系言語で大活躍の正規表現。
このスレは有用そうな正規表現を紹介したり、どう表現したらいいかわからないときに
質問をしたりするためのスレッドです。
質問するときは使用言語や得たい結果をなるべく詳しく書きましょう。

リンクなどは>>2-5のあたりに。
0206nobodyさん03/02/21 12:55ID:6n4aSTAx
>>203-205
了解です。
楽しようとせずSQL文を完成する前に
ひとつずつ置換えるようにします。

どうもでした。
0207nobodyさん03/02/21 15:31ID:???
>>206
お役にたてず申し分けない。
0208nobodyさん03/02/21 15:37ID:???
せめて一行に一回しか出て来ないとか、''の両端は必ず空白とかの目印があればいけそうだけど。
0209nobodyさん03/02/21 22:45ID:Kv1GvIlP
初歩的なあれですが、()のなかに()があって、
そのなかに | があっても大丈夫ですか?
/(2ch\.net|1ch\.(com|org))/
みたいな・・
0210nobodyさん03/02/21 22:52ID:???
>>209
.に行っているように\でエスケープしてください。
0211nobodyさん03/02/21 23:19ID:???
>>209
えっと・・あとどれをエスケープするんでしょうか?
この場合合致させたいのは
2ch.net
1ch.com
1ch.org
です
0212nobodyさん03/02/21 23:26ID:???
>>211
基礎から勉強し直せ。
0213nobodyさん03/02/22 10:01ID:???
てゆーか、それくらいとっとと自分で試してみればいいのに。
0214nobodyさん03/02/22 10:12ID:???
でもまあ、サーバー上でしか実験出来ないような環境作っちゃった場合は
聞いた方がはやいやーってなっちゃうだろうね。

0215nobodyさん03/02/22 10:46ID:???
>>214
>でもまあ、サーバー上でしか実験出来ないような環境作っちゃった

それ、何もしてないってことじゃん。
0216初心者質問者03/02/22 17:49ID:Db6aP06C
ダブルクオーテーションで括られた文字列の、
ダブルクォーテーション内部だけをマッチさせたいんですけど。
$1使わないと無理?
0217nobodyさん03/02/22 17:53ID:???
>>216
"が偶数回出てきてる行は囲まれてるな。
0218nobodyさん03/02/22 18:52ID:???
>>214
ActivePerlでもなんでも入れれば一発だろうにな。
怠惰な奴は嫌われる。
0219nobodyさん03/02/24 12:33ID:fQYme6i5
質問です。
ある文字列から始まらない任意の文字列、というのは
どうなって書けばいいんでしょうか。
例えば、<a href...>以外のタグを見つけるといった場合ですが、
文字列a hrefから始まらない、という事で
/<[^(a href)][^>]*>/
という感じかと思ったんですが、これではダメなようなので・・・。
0220nobodyさん03/02/24 18:33ID:???
>>219
!~ /^ある文字列から始まらない任意の文字列/
0221nobodyさん03/02/24 18:51ID:???
この場合、否定先読み、否定後読みを使うんじゃないかね?
0222nobodyさん03/02/24 22:21ID:???
Perl5の場合は、正規表現の拡張構文を使うとこんな感じ。

/<(?!a href).+?>/
0223nobodyさん03/03/03 16:51ID:PjU+W5oK
前スレに似たような質問を見つけて読んだけど・・・
なんか「知らんヤツ書くな!!」とかで正しいのかどうか解りません。。
どなたかご教授お願いします。

言語:Perl 掲示板CGIを作っています。
やりたいこと:特定のタグ以外は無効にする。
私が考えた処理は・・・指定したタグの中身に合致しなかったら消す。
@yukotag = "('b'.'/b'.'u'.'/u')";
if ($value ne "<@yukotag>") {
$value =~ s/<(.*)>//g;
}
でもこれではそもそも動かない・・・エラーにはならないけど。
#有効になるべきタグも消えてしまいます・
どうしたらよいのでしょう。
022422303/03/03 16:53ID:PjU+W5oK
もう一個考えた・・

if ($value ne "<(b|\/b)>") {
$value =~ s/<(.*)>//g;
}
0225nobodyさん03/03/03 16:55ID:???
全てのタグをエンティティに変換し、その後許可タグだけ戻すのが王道。
0226nobodyさん03/03/03 17:27ID:???
>>223-224
Perlを基礎から勉強してください。
基本的な考え方は>>225の通り。こんな感じで。

@yukotag = ('a','u');
$value =~ s/<(\/?.*?)>/<$1>/g;
map { $value =~ s/<(\/?$_.*?)>/<$1>/ig } @yukotag;
0227nobodyさん03/03/05 12:28ID:vWidvRyz
改行二回にマッチさせたいんだけど

$_=~/\n{2,}/g

ではだめれすか?
0228nobodyさん03/03/05 12:30ID:???
>>227
ダメだったんですか?
0229nobodyさん03/03/05 12:33ID:???
my $kaigyou = '(?:・r・n|・r|・n)'
$_ =~ /${kaigyou}{2,}/$nanika/g
023022703/03/05 12:37ID:???
マッチしませんれした
0231nobodyさん03/03/05 20:15ID:???
>>230
$_ =~ /\n{2,}/gs;
023223003/03/05 22:23ID:???
$a="aaa\nddd\nfff\n";
if($a=~/\n{2,}/gs){print"OK!\n";}

?????????????????????????????

0233nobodyさん03/03/05 23:11ID:???
>>232
Safariかよ。
0234nobodyさん03/03/05 23:36ID:???
>>232
おいおい、「改行ニ回」ってそういう意味かよ。
上の回答者はみんな、あんたが「ふたつ(以上)連続する改行」に
マッチさせたがってると思ったんだよ、あんたの質問と例を読んで。

$a = "aaa\nddd\nfff\n";
if(($a =~ s/\n/\n/gs) >= 2) { print "OK!\n"; }
023523003/03/06 03:31ID:???
スマソ
激しく反省
0236nobodyさん03/03/06 03:53ID:???
ネストした括弧へのマッチを一つの正規表現で表すことってできるかな。

((a.b)(c.d)(e(f(g.hij)))k) -> マッチ
((bcd))) -> だめ。

0237nobodyさん03/03/06 04:34ID:???
>>236
無理。
正規文法の限界。
(文脈自由文法以上ならいける
0238サチ03/03/08 13:12ID:dLehQyhy
@data=("a","b","ゝ","⊂","≡","⌒","▼","≧","∂");
my $count = 0;
foreach (@data) {
$count += $com =~/\Q$_\E/;
……

 この ~/\Q$_\E/ ってどういう意味なのでしょうか?
 厨房的な質問ですみません。
0239nobodyさん03/03/08 13:15ID:???
>>238
(ォと同じ意味ですよ。
0240nobodyさん03/03/08 13:20ID:???
>>238
それは正規表現というよりPerlの作法。
\Q =英数字以外の文字の前に\を挿入する。
\E =\L,\U,\Qなどの終了

print "\Q$_\E";
とかで効果を見たほうが早いかも。
0241サチ03/03/08 13:32ID:dLehQyhy
あまりに早いご返答ありがとございます。
本当にありがとうございます。
Perlの作法なのですか。
てっきり正規表現かと思ってました。(^_^;
どこかに参考となるURLありますか?
0242nobodyさん03/03/08 13:34ID:???
>>240の説明以上に何が知りたいのかと
0243nobodyさん03/03/08 13:36ID:???
>>242
$_の説明がまだだぞw 
0244サチ03/03/08 13:37ID:dLehQyhy
あっ、その”Perlの作法”がまとめられたトコがあるのかと
思いまして… ごめんなさい。
0245nobodyさん03/03/08 13:39ID:???
>>243
正規表現なのかと(以下略
>>244
ラクダ本
0246サチ03/03/08 13:54ID:???
これから買いに逝って来ます。
ありがとうございました。m(_ _)m
0247nobodyさん03/03/08 14:56ID:???
それを知るためだけにラクダ本を買うのか……
まあ、がんばれよ。
0248nobodyさん03/03/08 14:56ID:???
>>247
今頃びっくりのお値段に悶絶してることかと。 
0249nobodyさん03/03/08 15:13ID:???
3rd だと2冊だし。
デスクトップリファレンスで良いかと。
0250nobodyさん03/03/08 16:20ID:???
いや、これをきっかけに Perl ヲタになるやもしれん。
同じオライリーなら詳説正規表現もお勧めだよ。
0251サチ03/03/08 18:13ID:???
高かぁ〜い!ヽ(`Д´)ノ
お金がないので諦めました。

詳説正規表現ですか。。φ(..)


0252nobodyさん03/03/08 20:14ID:???
よく入門書で、「正規表現を詳しく解説してると本が1冊書ける」とか書いてるけど
本当に本1冊書けるし、実際に本が出てるんだよね。
それぐらい奥深いものなのかと。
0253nobodyさん03/03/08 20:38ID:???
俺はソフトバンクの「正規表現の達人」持ってる。
他にも赤い表紙の奴とか、オライリー以外にも2、3冊ぐらい
正規表現の本を見かけたことがある。
025417703/03/08 20:46ID:???
詳細も高いって(w。
025525403/03/08 20:47ID:???
おっと、詳説でした。
0256nobodyさん03/03/08 21:07ID:???
でも詳説は勉強になったよ。
あれ勉強してからチューンしたら性能が4割は上った。
はじめは馬鹿にしてたんだけどね。
0257nobodyさん03/03/08 21:53ID:???
確かにいい本です。
正規表現はスクリプトの実行速度に影響を与えていることが
結構あったりしますので、コードチューニングには、いい本です。
しかし、入門には少々マニアックすぎるかも。
# 毒食えば皿までかな。
0258nobodyさん03/03/09 00:39ID:???
>>237
Perl5.6以降では(??{})でいけたような。
もはや「正規表現」とは言えないわけだがだいぶ前から
Perlの正規表現は厳密な意味で正規表現じゃないし
0259nobodyさん03/03/09 00:51ID:???
>>251
忘れてた。Perlに限るなら、EffectivePerl(3章)をおすすめ。
0260nobodyさん03/03/09 12:49ID:9EZ5B9RA
JavaでOMOつかってます。matchで「aaabbbcccdddd」という文字列に対し、
aもしくはdという文字列が含まれているかという判定を正規表現で書きたいのですが…
超初心者ですんません。

0261nobodyさん03/03/09 12:54ID:???
>>260
[ab]
026226003/03/09 16:47ID:???
ありが�d�d�d
0263nobodyさん03/03/11 10:43ID:V1nwV3pf
「次の言語に対する正規表現を書きなさい
 0と1からなる列で0は偶数回、1は奇数回現れるもの全て。」

わからない…。ていうか可能?
0264nobodyさん03/03/11 10:58ID:???
>>263
(00)* 偶数=2n

(11)*1 奇数=2n + 1



0265nobodyさん03/03/11 11:05ID:???
>>264
ハァ?10110とかもだろ
0266nobodyさん03/03/11 11:12ID:???
>>265
良かったな。
0267名無しさん@Meadow03/03/11 11:16ID:wliWOweu
>>263
Perlだしゅ。正規表現じゃないな。
while(<>) {
@zero=m/0/g;
@ichi=m/1/g;
if ($#zero % 2 != 0 and $#ichi % 2 == 0) {
print;
}
}
0268nobodyさん03/03/11 11:17ID:???
>>263
その問題文、「次の言語に」って言い回しからしてなんか怪しくない?
0269nobodyさん03/03/11 11:45ID:???
>>268
どういうこと?原文ままだと

*3.7 次の言語に対する正規表現を書きなさい.
 a) 5個の母音a,e,i,o,uがこの順序でどこかに現れる英字列すべて
 b) 辞書式順序の関係に従って現れる英字列すべて
 (略)
 f) 0と1からなる列で,0は偶数回,1は奇数回,現れるものすべて
 (以下続く)

「コンパイラI 原理・技法・ツール」(通称ドラゴンブック)ていうやつの練習問題。
0270nobodyさん03/03/11 14:35ID:???
>>269
ソレ、学校の課題かなんかじゃねえの?
それなら自分でやれよ。

もし違うならスマソ
0271nobodyさん03/03/11 15:29ID:???
>>269
普通なら「次の文字列に対する〜」だと思うが。
言語?
0272nobodyさん03/03/11 16:10ID:???
ところで。
オライリージャパンの「正規表現」って本読んだ。
ちょっと古めなのであれだったけど。
(\4000)

書いてある内容はあれだったけど、
説明のしかたがクソだった。

よくオライリーからあんなクソ説明本が出たもんだ。
読んでる途中で嫌になってくる。
0273nobodyさん03/03/11 18:14ID:???
>>272
アンタの説明も(ry
0274nobodyさん03/03/11 19:10ID:???
>>270
いや、ただ気になったので。この類の本って問題だけで答えがないってのが
多い気がする。

>>271
「言語」はあるアルファベット(文字集合)からなるものの列をいうっていうようなことが
書いてあるので、たぶんここでは文字列っていうのと同じとみていいと思う。
「言語 受理」で検索するとそれっぽいページが多くヒットするので分野によっては
普通の表現なのかも(「受理」はまぁつまり「マッチが成功する」って言う意味)。
0275nobodyさん03/03/11 23:48ID:???
あぁー分からないよぉ。。もちろんPerlの拡張正規表現は使わないんでしょ?
0276nobodyさん03/03/12 00:09ID:???
>>275
あんたが何がわからないかわからないのだが
0277nobodyさん03/03/12 00:23ID:???
>>275
使えばできる?
0278nobodyさん03/03/12 22:04ID:hmpHRxfR
2ちゃんのスレッドのソースから名前だけ取り出す正規表現ってどうすればいいですか?
0279nobodyさん03/03/12 22:31ID:wNWBQmqk
>>272
たぶんあなたのレベルの問題だと思うぞ。
あと2,3回我慢して読んでみなよ。
0280nobodyさん03/03/12 22:38ID:???
.*
と
.+?
の違いって何ですか??
0281あぼーんNGNG
あぼーん
0282nobodyさん03/03/13 02:18ID:???
>>280
前者にヒットして後者にヒットしないものは空文字列くらいかな。
0283nobodyさん03/03/13 02:21ID:???
>>282
後者にはなんでヒットしないの?
0284nobodyさん03/03/13 02:42ID:???
>>283
そういうルールだから
0285nobodyさん03/03/13 15:28ID:???
あれ、
(x?) って (|x) の略記法だと思ったんだけど。
だから空にもマッチするんじゃないの?
0286nobodyさん03/03/13 15:44ID:???
>>285
その"?"と、>>280の"?"では意味が違います。
>>280の"?"は量指定子(この場合は"+")の後ろにありますので、
これは「最短のマッチを選べ」という指示になります。
結果として、".+?"は「何か一文字」にマッチするということになりますね。
0287山崎渉03/03/13 16:58ID:???
(^^)
0288nobodyさん03/03/13 19:43ID:???
>>286
なるほど、"+?" で一つのメタ記号なんですね。ゴミレススマソ
0289nobodyさん03/03/13 19:45ID:???
>>288
違うぞ。
0290nobodyさん03/03/14 00:04ID:???
0291nobodyさん03/03/14 00:04ID:???
0292nobodyさん03/03/14 00:04ID:???
0293nobodyさん03/03/14 00:05ID:s293/lDl
293get
0294nobodyさん03/03/14 00:23ID:???
{0,1}という意味での?と、
* +の後ろにくっつけた?は意味が違う。

だから、*? +?で1つのメタ文字として考える方が正しいといえる。
0295nobodyさん03/03/14 00:38ID:???
>>294
*?とか+?は、メタキャラクタのみで構成されているってだけの話で、
所詮は正規表現の1パターンでしかないと思ふ。
0296nobodyさん03/03/14 18:50ID:???
>>282は間違いなんですね?
0297nobodyさん03/03/14 20:20ID:???
>>296
伺う前に自分で実験しる。これ基本。
0298nobodyさん03/03/14 21:01ID:???
>>297
わかりやしたです。
0299nobodyさん03/03/15 23:25ID:???
量指定子の後ろに「?」をつけると「最短一致」
だから>>280は間違いと。やっとわかったよ。
0300nobodyさん03/03/20 21:24ID:8BKMA1mq
>>299
ちがうよ(ぷ
0301nobodyさん03/03/21 01:13ID:???
>>263 http://www.din.or.jp/~ohzaki/regex.htm#AevenBodd
0302nobodyさん03/03/26 17:02ID:4WzRK9Se
文字列の中で、「;」を消したいんだけど「<」や「>」の「;」は
そのままにしておきたいような場合はどのように表記すればいいんでしょうか?
s{[^(?:&|<|>|")];}{}g とか
s{[^&|<|>|"];}{}g とかやってみましたがうまくいかず。
どなたか助けてください。
030330203/03/26 17:16ID:4WzRK9Se
↑間違えました。

文字列の中で、「;」を消したいんだけど「&lt;」や「&gt;」の「;」は
そのままにしておきたいような場合はどのように表記すればいいんでしょうか?
s{[^(?:&amp|&lt|&gt|&quot)];}{}g とか
s{[^&amp|&lt|&gt|&quot];}{}g とかやってみましたがうまくいかず。
どなたか助けてください。
0304nobodyさん03/03/26 19:37ID:???
>>303 Perlならこれでどうだ
s/(&(amp|lt|gt);)|;/$1/g
0305nobodyさん03/03/26 19:42ID:???
s/(?<=&\w+);//g
0306nobodyさん03/03/27 01:45ID:lpoVliEY
はじめまして。正規表現覚えたての者です。
if($FORM{'pass'} =~ /[0-9]pass/)

わかると思いますが、これは$FORM{'pass'}が[0-9]passだったら○○する、という命令なんですけど、
この0から9を0から24にしたいんです。
if($FORM{'pass'} =~ /[0-24]pass/)
これじゃあ0から2と認識されてしまいました。

どうかご教授お願いします。。
■ このスレッドは過去ログ倉庫に格納されています