正規表現道場@2ch Part3 s/煽り|荒らし/あぼーん/g
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
03/11/19 21:42ID:Kst3Nn4Sこのスレは有用そうな正規表現を紹介したり、どう表現したらいいかわからないときに質問をしたりするためのスレッドです。
質問するときは使用言語や得たい結果をなるべく詳しく書きましょう。
註:& や " を書くときには、& " と描いておきましょうね。
Perlメモ
http://www.din.or.jp/~ohzaki/perl.htm
正規表現メモ
http://www.kt.rim.or.jp/~kbk/regex/regex.html
Regex::Diagram.pm
http://www.cc.rim.or.jp/~midorin/mad-p/RegexDiagram.html
正規表現
http://www.cc.rim.or.jp/~midorin/mad-p/perl/benkyou/PRC2kRegex/
UNIX正規表現入門 目次
http://www01.u-page.so-net.ne.jp/jc4/hiroyuki/rex_index.html
Regular Expression(Riue ちゃんの正規表現講座) - Index
http://www.sixnine.net/regexp/
ほとんどは↓のリンク集にまとまっています。
正規表現最新リンク集2002
http://www2.famille.ne.jp/~akio1998/l_grep.html
過去スレ
正規表現道場@2ch
http://pc.2ch.net/test/read.cgi/php/996105815/
正規表現道場@2ch Part2
http://pc2.2ch.net/test/read.cgi/php/1038146241/
0291266
04/02/25 20:16ID:v7alvSdo>>269
レスどうもっす。
>Perlなら
>$hoge !~ /^mojiretu/g;
>で、文字列以外にヒットするはず
ん〜、申し訳ない、説明不足した。
正規表現で「mojiretu」が無い事にマッチしたいんですよ。
どうでしょう?
0292nobodyさん
04/02/25 20:19ID:???http://www.din.or.jp/~ohzaki/regex.htm#Without
0293nobodyさん
04/02/25 22:58ID:???0294nobodyさん
04/02/26 12:30ID:pqrzwzpGとした場合、
@が含まれる文が、エラーになるのは
あたりまえなのですが、
病院 という語句までも制限してしまいます。
shift-jisですけど、文字コードとかが関係しているのでしょうか?
0295nobodyさん
04/02/26 13:27ID:???http://homepage1.nifty.com/nomenclator/perl/shiftjis.htm
0296294
04/02/26 13:29ID:???「ァ」や「院」は@と認識されてしまうみたいですね・・・
一度、他の文字に変換してから、
元に戻そうと思います・・・
0298nobodyさん
04/02/26 16:11ID:???print $1;
}
という処理をした時に、$search内に正規表現用文字($や^等)が入っていた時
例)
$search = "[abc]"等
に、それを正規表現としてとらえてしまいます。
調べてみたところ、どうやらそれが正しい動作という事でしたが、
この$searchを単なる文字列として見て、例のような文字列の検索を行った時に
「aかbかc」ではなく、「"[abc]"という文字列」として検索するにはどうすれば良いんでしょうか。
0299nobodyさん
04/02/26 16:31ID:???http://www.kt.rim.or.jp/%7ekbk/perl5.005/perlre.html#Regular_Expressions
http://www.kt.rim.or.jp/%7ekbk/perl5.005/perlfaq6.html#How_can_I_quote_a_variable_to_us
以後、Perl の質問は http://pc2.2ch.net/test/read.cgi/php/1075545279/ へ。
0300nobodyさん
04/02/27 00:44ID:28vfJb2lperlなのですが、
テキストボックスに入れた数値を$in{'count'}に格納して、
それが数字じゃなければエラー出しして終わりにしたいのですが、
数値だろうと、そうでなかろうと、いかのunlessの中を通りません。
unless ( ($in{'count'} =~ m/^[1-9][0-9]*$/) || ($in{'count'} == 0) ){
print "Content-type: text/html\n\n";
print "数字を入れてください。もどってください。";
exit;
}
0301nobodyさん
04/02/27 01:04ID:???こういうことか?
if ("hoge" == 0) { print "ZERO\n" } else { print "NON-ZERO\n" };
0302300
04/02/27 01:33ID:???えっと、ごめんなさい、正確に言うと、
「正の整数」を入れてもらいたいので、そうでない場合は、エラーではじきたいのですが。。。
「dhfshfhjksad」みたいな適当な文字を入れてもエラーをすり抜けてしまうし、
「345」みたいちゃんとした「正の整数」を入れても、エラーをすり抜けてくれる。。。
0303nobodyさん
04/02/27 01:46ID:???数字は $in{'count'} =~ m/^[1-9][0-9]*$/ で真になるから unless
ブロックに入らない。(数字を含まない) 文字列を数値コンテキスト
で評価すると 0 になるので $in{'count'} == 0 で真になるから unless
ブロックに入らない。
以後、Perl の質問は http://pc2.2ch.net/test/read.cgi/php/1075545279/ へ。
0304nobodyさん
04/02/27 03:08ID:zgPOAYIB感謝!
(?:(?!foo).)*
これかぁ〜、なるほど実験しみます。
0306nobodyさん
04/02/27 21:31ID:???0307nobodyさん
04/02/28 22:17ID:???こういうタグをいったんサニタイズした文字列
<P class="fuga">hoge</P>
に対して
m/<(P|H[1-6]|ADDRESS|PRE|BLOCKQUOTE|DIV|OL|UL|DL)(| class="\w{1,20}")>(.*)<\/$1>/
こういう感じにマッチさせたいのですが、$1が働かないのはなぜでしょう。
$1に「P」が入ってうまくいくと思うのはマチガイ?
0308nobodyさん
04/02/28 22:22ID:???実体参照されちまった。こうです。
&lt;P class="fuga"&gt;hoge&lt;/P&gt;
m/&lt;(P|H[1-6]|ADDRESS|PRE|BLOCKQUOTE|DIV|OL|UL|DL)(| class=&quot;\w{1,20}&quot;)&gt;(.*)&lt;\/P&gt;/
0309nobodyさん
04/02/28 22:25ID:K5IxNsG1<P class="fuga">hoge</P>
m/<(P|H[1-6]|ADDRESS|PRE|BLOCKQUOTE|DIV|OL|UL|DL)(| class="\w{1,20}")>(.*)<\/P>/
0310nobodyさん
04/02/28 22:26ID:???http://www.kt.rim.or.jp/~kbk/regex/regex.html#BACKREF
0311nobodyさん
04/02/28 22:32ID:???く、なるほど。perlの特殊変数と正規表現を混同していたわけか・・・
ありがとうございました。恥ずかしい失敗ですが、一歩前進。
なんども失敗してスマン。
0312nobodyさん
04/02/29 14:20ID:tS63OhT8整数のみのチェックは正規表現でできました。
^[0-9]+$ 整数のみの正規表現
EUCの半角カナのみの正規表現は?
0313nobodyさん
04/02/29 14:29ID:???^(ア|イ|ウ|エ|オ)+$
0314nobodyさん
04/02/29 15:25ID:???EUC の半角カタカナは、SS2 (8E) + JIS X 0201 カタカナ (A1-DF) だから、
こんな感じでいけそうな気がします。
いかがでしょうか。
^(\x8E[\xA1-\xDF])*$
0315nobodyさん
04/02/29 17:41ID:???PHPスレで聞いてる
0316nobodyさん
04/03/01 00:32ID:uvhpNWvzの?以降の件名部分をPHPで削除したいんだけど、
$str= ereg_replace("/?.*/", "" , $str);
では無理だった・・。
これではお話になりませんか?
0317nobodyさん
04/03/01 00:56ID:???0318316
04/03/01 02:31ID:???要らないかもしれないけど、書いときます。
$mail = "[email protected]?subject=件名"
preg_match("/^[\w\-\.]+@[\w\-]+\.[\w\-\.]+/","$mail", $matches);
$mail = $matches[0];
正解かどうかわかりませぬが、これでやっていこうと思います。
0320nobodyさん
04/03/03 11:51ID:???1.英数字のピリオド区切り
2.英数字のみ
のいずれかの条件でマッチさせようと思い、
(リモホ) =~ m/^(\w+\.?)+\w+$/
などとやったのですが駄目なようで、これ以上思い浮かびません。
どうすれば良いのでしょう。
0321nobodyさん
04/03/03 15:08ID:???こうじゃね?
m/^(\w+\.)*\w+$/
もうちょっと仕様どおりちゃんとやるならこう?
m/^(?:[0-9a-z]+\.)*[0-9a-z]+$/i
0322nobodyさん
04/03/04 01:43ID:???有無を調べれば良かったんですね。
ありがとうございました。
0323nobodyさん
04/03/05 07:43ID:???if ( $charactor =~/[^あ_ん]/) {
print "あーんを以外含んでいます。\n";
}
というふうにしてみたのですが
上手くいきません
自分では見当がつかないのでアドバイスをください
0325nobodyさん
04/03/05 11:00ID:???># 全角ひらがな [ぁ-ん]
>$Zhiragana = '(?:\xA4[\xA1-\xF3])'; # EUC-JP
>$Zhiragana_sjis = '(?:\x82[\x9F-\xF1])'; # SJIS
なので、EUC-JPならこうかな。つかPerl分からん。
if (!$charactor =~/^(\xA4[\xA1-\xF3])*$/) {
print "ひらがな以外を含んでいます。\n";
}
0326nobodyさん
04/03/05 11:53ID:???コピペするときに間違えました。
>>325
ありがとうございます!
if ( $charactor =~/[^\x82\x9F-\xF1]/) {
print "あーん以外を含んでいます。\n";
}
これで出来るようになりました。
0327325
04/03/05 12:00ID:???ちょっと待て、それじゃ誤判定しない?
ひらがな以外にマッチではなく、「『文字列がひらがなのみ』にマッチしない」としないと。
if ($charactor !~ /^(?:\x82[\x9F-\xF1])*$/) {
print "ひらがな以外を含んでいます。\n";
}
0328nobodyさん
04/03/06 21:48ID:???ハイフンも使えるから
m/^([\w\-]+\.)*[\w\-]+$/
のような気が。
#ハイフンのエスケープ要るか要らないか忘れたけど
0329nobodyさん
04/03/07 22:19ID:???マッチする正規表現をお教え下さい。
ア[ッツ]?ト{マ[ーアァ]?ク}? とか アッ?ツ?ト{マ[ーアァ]?ク}?
初心者なので全然だめです・・。
0330nobodyさん
04/03/07 23:11ID:???@|@|(あ[っつ]?と).*|(ア[ッツ]?ト).*|(ア[ッツ]?ト).*
でいくことにします。
アットローンでもマッチしちゃうけどいいや・・・・・。
0331nobodyさん
04/03/07 23:11ID:???0332nobodyさん
04/03/08 03:41ID:???0333nobodyさん
04/03/08 05:41ID:???アットローンでもアトムでもマッチしちゃうよね?
^ア[ッツ]?トマ[ーアァ]?ク$ だと「アット」「アト」がマッチしない・・・
「アット」と「アットマーク」にマッチして「アットローン」にマッチしないなんてできないのかなo(~ρ~)o zzz・・・
0335nobodyさん
04/03/08 13:19ID:???その中で「//〜〜〜\n」や「/* */」などのいわゆるコメントの部分を
色分けして表示したいのですがコメント部分とマッチさせる正規表現がどうしてもわかりません。
「/* */」については/*を<FONT COLOR=RED>/*にし
*/を*/</FONT>にしたのですがこれだと
「""」に囲まれたコメントではない部分も色分けされてしまいます。当たり前ですが・・・。
0336nobodyさん
04/03/08 15:37ID:???こんなんでいいんじゃないか
<?php
header("Content-Type:text/html; charset=Shift_JIS");
$comment[0] = "\/\/[^\n]*?\n";
$comment[1] = "\/\*(.*?)\*\/";
$msg = "TextTextText // TextText
TextText
TextTextText /* TextText */
TextText
// TextText /* TextText */ Text
Text
";
foreach($comment as $regexp){
$msg = mb_ereg_replace($regexp,"<span style=\"color:red\">\\0</span>",$msg);
}
$msg = nl2br($msg);
echo $msg;
?>
0337nobodyさん
04/03/10 21:20ID:???$jis=Jcode->new($ARGV[0],'utf8')->jis;
$jis=~s/([^a-zA-Z0-9])/sprintf("%%%02lX",unpack("C",$1))/eg;
$jis=~s/%1B%28B$//; $jis=~s/^%1B%24B//; # <= separate
$jis=~s/%/\\x/g;
こいつで16進にして正規表現かけてんですが
___ファイル内のjisコード文字列____
ああ接続FTP接続うう
__________________________________
FTP接続 <= なら引っかかってくれます
接続FTP <= だと駄目です
なぜに?
0339337
04/03/10 22:49ID:QeEknFJhFTP\x1B\x24B\x40\x5CB3
perl 接続 <= これもOK
\x40\x5CB3
perl 接続FTP <= だと駄目でつ
\x40\x5CB3\x1B\x28BFTP
s/\G と逝ってみたいんですがどこで使うんでつか
アホですまそ
0340nobodyさん
04/03/11 22:13ID:???abc abc%xyz 123 123%xyz
という4つの文字列があるときに、左から順番に、
$1 に 'abc' が代入されるようにマッチする
マッチしない
$1 に '123' が代入されるようにマッチする
$1 に '123'、 $2 に 'xyz' が代入されるようにマッチする
にはどう書けばよいでしょうか?
/^(?:(abc)|(123)(?:%(xyz))?)$/
だと、3つ目と4つ目の '123' が $2 に入る
/^(abc|123)(?:%(xyz))?$/
だと、2つ目がマッチする
/^(abc|123(?:%(xyz))?)$/
だと、4つ目の $1 に文字列すべてが入る
みたいな感じでだめでした。
わかりにくい上に低レベルな質問で
申し訳ないですがよろしくお願いします。
0342340
04/03/11 23:05ID:???ありがとうございました。完璧です。
こういうときに Positive Lookbehind Assertion 使うんですね。
ぜんぜん思いつきませんでした orz
0343nobodyさん
04/03/22 16:58ID:JNc4vCtRJavaScriptでの分岐条件ですが、
「reply_toがないか、あるいはあっても数字以外の文字が含まれている場合はtrue」
という条件式です。
上記でどうもうまく行っているのですが解せません。
数字以外の文字って「\D」ですよね。何か勘違いしていますか?
perl/CGI+JavaScriptで製作中ですが正規表現はあまりやった事ないです。
あるいは上記条件式だとどう書くのが普通ですか?
0345nobodyさん
04/03/22 17:04ID:???0346nobodyさん
04/03/22 17:54ID:???> if (inNaN(reply_to)) だった
isNaN(reply_to)でした。
こんなんがあるんですね。
勉強になりました。
0347nobodyさん
04/03/22 18:05ID:???あと、aString.search(aRegExp) は、「マッチした位置」を返すので、
たぶん >>343 のはうまくいっていないと思われ。
マッチしないときには -1 を返すので、
if ( !reply_to || reply_to.search(/\D/) >= 0 )
とかじゃないかな?
0349343
04/03/22 18:24ID:???> isNaN で良いの? isNaN("123foo") とかも false になるよ。
えーと、今回は数字以外の文字が含まれてたら false でオッケイです。
>
> あと、aString.search(aRegExp) は、「マッチした位置」を返すので、
> たぶん >>343 のはうまくいっていないと思われ。
> マッチしないときには -1 を返すので、
> if ( !reply_to || reply_to.search(/\D/) >= 0 )
> とかじゃないかな?
なるほど、、、微妙に返り値が違うんですね。
単純にブール値を返すもんだと思ってました。
勉強になりました。
クライアントサイドJavaScriptってうまく組み込むと便利ですけど、
ブラウザ依存だったりバージョン互換性の問題とか、結構微妙ですね。
いえ、今回の件とは関係ないですけど。
ありがとうございました。
0350343
04/03/22 18:26ID:???> >>347
> falseになるわけねぇだろうが
ああ、そうですね。数字かどうかですからね。
trueでいいんです。
たぶんうっかりミスですね。御指摘どうも。
0352nobodyさん
04/03/29 21:33ID:???0353nobodyさん
04/04/08 15:03ID:AQ8qwK3rのようなダブルクォートで囲まれた文字列を取得したいのですが、
文字列に\"を含んでいる場合うまく取得できません。
"[^"]*"と書いているので当然と言えば当然なのですが・・・
どのようにしたら、\"を含む文字列をうまく取得できますでしょうか?
0354nobodyさん
04/04/08 15:38ID:???/"(.*)"/
こういうのもありかもしれないけど。
/"((?<=\\").*)"/
0355354
04/04/08 15:46ID:???0356nobodyさん
04/04/08 17:11ID:???0357nobodyさん
04/04/09 17:13ID:Nk138A/fhtmlファイル中で、aタグ中のリンク先の置換をやりたいのですが、
・mailto:やtel:が含まれる場合は除外
・リンク先(href="url")のurlが、cgiやphp、jspだったら除外
というのをやりたいのです。
で、それで引っ掛かった分(htmlやhtm)を、特定の文字列に置換したいのです。
で、
/<a href="(([^(tel:|mailto:)][-0-9a-z/@~]+[^(.php|.cgi)]") ([^>]+))>/i
なんてやってるんですが、思うようにならんです。
どこがおかしいのでしょう?
先達の皆さま、よろしくおながいします
0358未承諾広告※ ◆aiY4htt2.2
04/04/09 17:59ID:???もしかして、//i -> s///i かな?
s{<a href="((?<!tel:|mailto:).+?(?!\.php|\.cgi)".+?>)}{url=$1}i;
実証はしていませんm(_ _)m
0360nobodyさん
04/04/09 19:04ID:???s/<a href="((?!tel:|mailto:)[-_.!~*'()a-z0-9;\/:@&=+$,%#]+(?<!\.php|\.cgi))"[^>]*>/url=$1/i;
こんな感じ?
>>357
'?'を許さないことで、クエリストリング付きは
即時却下する所が面白いね。
0361nobodyさん
04/04/09 19:08ID:???一回のマッチで全部判定できなくもないが、分けた方が楽且つ柔軟。
言語が Perl5 なら
s{
(
<a
[^>]+?
href=(?:(")|(')|(\b))
)
(
(?(2)[^"]+?)
(?(3)[^']+?)
(?(4)[^\s>]+)
)
(?=
(?(2)")
(?(3)')
[^>]*?
>
)
}
{
my($pre, $url) = ($1, $5);
if ($url !~ /^(?:mailto|tel):|\.(?:cgi|jsp|php)$/i) {
$url =~ ...
}
$pre . $url
}egix;
0362nobodyさん
04/04/09 21:00ID:B1AI3byV明日再挑戦します。
ありがとうございます
0363nobodyさん
04/04/10 13:43ID:rupp3c37360さん、361さん、ありがとう!うまくいきました。
でも、361さんのは、漏れには何をやってるのか識別不能です....鬱
0364nobodyさん
04/04/14 21:47ID:8xwTd1PB0365nobodyさん
04/04/14 21:47ID:8xwTd1PB0366
04/04/20 01:22ID:UZzv87o5<a href=http://bbq.2ch.net/bbynews/i/>速報Headline</a> を
<a href="http://bbq.2ch.net/bbynews/i/">速報Headline</a>
の様に、href=の中身を " で括りたいのですが、
$str =~ s/(<[^>]*\bhref\s*=\s*['\"]?)([^\s\"'>]*)/\1\"\2\"/g;
としてしまうと、元々 " で括られている場合にもさらに " が付いてしまうため困っています。
" が無い場合のみ " で括るようにするにはどうすればよいでしょうか。
お知恵をお貸しくださいませ。
0367nobodyさん
04/04/20 06:46ID:???s{
(?<=href=)
(?:(")|(')|(\b))
(
(?(1)[^"]+)
(?(2)[^']+)
(?(3)[^\s>]+)
)
(?(1)")(?(2)')
}
{"$4"}gix;
0368nobodyさん
04/04/20 16:41ID:2Qvzqrcyあるhtmlファイルの
<!--ここから//-->
テキストテキストテキストテキストテキストテキスト
<!--ここまで//-->
という「<!--ここから//-->」の部分と「<!--ここまで//-->」の間にあるテキストを
他のphpファイルからereg_replaceで置換したいのですが可能でしょうか?
可能な場合、上記の範囲指定は正規表現でどう書いたらよいのでしょうか?
0369nobodyさん
04/04/20 17:17ID:???http://php.s3.to/man/ref.regex.html
http://www.kt.rim.or.jp/~kbk/regex/regex.html#POSIX
0372nobodyさん
04/04/21 05:52ID:???s/(<\w+\s+href\s*=\s*)(['"]?)([^\2\s>]*)\2(\s*>)/$1"$3"$4/gi;
# まんまですな。
>>371
どこらへんがDQNなの?
0377nobodyさん
04/04/21 19:55ID:???おいおい、もう夏の暑さが近づいているというのにまだ春厨か?
いい加減自演認定は恥ずかしいと思えよ。
俺は面白そうだから便乗しただけ
#って書いてもどうせ煽ってくる春厨だろうけど
0379nobodyさん
04/04/21 20:02ID:???俺は面白そうだから便乗しただけ
俺は面白そうだから便乗しただけ
ワラタ
0382372
04/04/21 21:03ID:???がっがり。
0383nobodyさん
04/04/21 22:05ID:???0385nobodyさん
04/04/21 23:45ID:???これをPHPで使うにはどう変更すればいいでしょうか?
preg_replace関数を使ってみたのですが、マッチしてくれませんでした。
0387nobodyさん
04/04/22 06:41ID:???$str = '<a href=http://bbq.2ch.net/bbynews/i/>速報Headline</a>';
$result = preg_replace('/(<\w+\s+href\s*=\s*)([\'"]?)([^\2\s>]*)\2(\s*>)/i', '$1"$3"$4', $str);
こんなのでいけた。
うまくいきました。ありがとー
条件を " でくくっててマッチしないのを、 ' に変更したらできました。
0389nobodyさん
04/04/28 11:02ID:YDy2pcOHsub/test.htmから<n月>という文字列がある行をマッチさせたいのですが、下のようにすると
ローカルではマッチするんですが、サーバーに上げるとマッチしなくなります。
print "content-type: text/html\n\n<html>";
open(TEST, "sub/test.htm");
while (<TEST>) {
if ($_ =~ /<.*?月>/) {print $_;}
}
close(TEST);
print "</html>";
exit;
4行目を
if ($_ =~ /<(.*?)月>/) {print $_;}
に書き換えるとローカルでもサーバー上でもマッチします。なぜでしょうか。
0390nobodyさん
04/04/28 13:08ID:???「ローカル」と「サーバー」のそれぞれの Perl のバージョンは?
スクリプトと sub/test.htm のそれぞれの文字コードは?
■ このスレッドは過去ログ倉庫に格納されています