正規表現道場@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/
0424420
04/05/09 02:08ID:???はい。フォームに入力してもらった文字列をオウム返しに次のページに出力したり
内容をsendmailで送ったりの時に文字化けが起こらないようにしたいんです。
ところで、みんなはクエリは受け取ったらeucに変換して処理をした後、出力時にsjis
に変換しているのですか?
プラットフォームがwinならsjisで、unixならeucに変換して扱うみたいな事を聞いたの
ですが、winでも処理時はeucで出力の時にsjisに変換すれば大丈夫なんでしょうか?
0425nobodyさん
04/05/09 02:16ID:???http://homepage1.nifty.com/nomenclator/perl/shiftjis.htm
0426nobodyさん
04/05/09 02:18ID:???HTMLをEUCで書く
PerlCGIをEUCで書く
「表」とかで悩んだことは一度も無し。
ほんとみんな無駄な苦労してるなあと思ってる。
HTMLがShift_JIS指定されてたら、最初にEUCに変換してから処理してる。
(変換時にはちゃんとincode=sjisを付ける)
0427420
04/05/09 02:39ID:???も自動的にShift_JISで書いてました。何かエディタを使おうと思いますが、色付けもなく
特定文字が太字にもならない、メモ帳と違うのは漢字コード指定で再読み込みができる
っていう感じのはないんですかね。一応terapadは持ってるんですが、色はよくても
太字になるし、たまに挿入モードから勝手に上書きモードになっちゃうしで、使いづらいんですよね。
>>426
>HTMLがShift_JIS指定されてたら、最初にEUCに変換してから処理してる。
ここらへんが不安だったのでeucで書くのをためらってるのですが、htmlやperlを書くときに
エディタを使ってeucで書くと、ブラウザ側がシフトJISの時に文字化けしますよね?
〜最初にeucに変換してから処理する〜の意味が理解できなくて・・・
>>425のサイトとperlメモを流し気味で読みましたが、ちゃんと読めば上記についても
解説されてるのでしょうか?
とりあえずお腹が空いたので、お茶漬けでも食べます。
0428nobodyさん
04/05/09 03:08ID:???> はい。フォームに入力してもらった文字列をオウム返しに次のページに出力したり
> 内容をsendmailで送ったりの時に文字化けが起こらないようにしたいんです。
そこでなんで $_ =~ s/表/表\/g; みたいな処理が必要なの?
0429420
04/05/09 03:48ID:???中に表が入っているか検索して、入っていたら表の後ろに\をつけて問題を解決しようと
思ってましたが、sjisでやること自体が間違いみたいですね。
ところでこれはスレ違いな質問なんですが、エディタを使う事にしたのでファイルの関連付けをメモ帳の部分を
全て変えたのですが、HTMLページのソースを開くときに何故かメモ帳が起動してしまうのですが
どうしてでしょうか。
0430420
04/05/09 04:05ID:???>(変換時にはちゃんとincode=sjisを付ける)
perlをeucで書く場合(HTMLがShift_JIS指定されてる場合),
print "文字列";
を
$data="文字列";
jcode::convert(\$data,"sjis");
print $data;
としなくてはならないのですか?ってこれも凄いスレ違いですね。こうゆう事はどこのスレに行って
質問すればよいでしょうか。
0432nobodyさん
04/05/09 04:38ID:???> っていう感じのはないんですかね。一応terapadは持ってるんですが、色はよくても
> 太字になるし、たまに挿入モードから勝手に上書きモードになっちゃうしで、使いづらいんですよね。
「勝手に」なるんだったら使えないな。素人の言い訳みたいだな。
> ここらへんが不安だったのでeucで書くのをためらってるのですが、htmlやperlを書くときに
> エディタを使ってeucで書くと、ブラウザ側がシフトJISの時に文字化けしますよね?
普通ブラウザ側の表示文字コードは自動判別になっている。
自動判別に失敗するのを防ぐためのContent-Typeだ。(IEはContent-Typeは見ないんだったっけ?
> >>425のサイトとperlメモを流し気味で読みましたが、ちゃんと読めば上記についても
> 解説されてるのでしょうか?
ちゃんと読んでから何か発言してください。
>>429
> 全て変えたのですが、HTMLページのソースを開くときに何故かメモ帳が起動してしまうのですが
> どうしてでしょうか。
窓の手入れろ
0433nobodyさん
04/05/09 04:40ID:???> >HTMLがShift_JIS指定されてたら、最初にEUCに変換してから処理してる。
> >(変換時にはちゃんとincode=sjisを付ける)
> perlをeucで書く場合(HTMLがShift_JIS指定されてる場合),
> print "文字列";
> を
> $data="文字列";
> jcode::convert(\$data,"sjis");
> print $data;
確かにそうしなければならないが、俺はそれは嫌だからプログラム内に日本語は書かない。
そもそもプログラム内にprintがない。
HTML::Template Template-Toolkit Template:Extract
0434420
04/05/09 05:03ID:???色々ためになるアドバイスありがとうございました。
>>433
参考にします!ほんとに感謝です。
それでは失礼します。
0435nobodyさん
04/05/11 15:44ID:g6OxcqtT文字列 a=A b="B" c="C d=D" e に対して、
a=A
b="B"
c="C d=D"
e
が出てくるパターンを教えてくださいませ。
之では駄目みたいなんです → /(\w\=(\w|\"\w\")|(\w))/
0436nobodyさん
04/05/11 16:11ID:???0437436
04/05/11 16:15ID:???0438435
04/05/11 16:26ID:???0439nobodyさん
04/05/24 16:10ID:yOpX2XMb$dataにはhtmlがごちゃごちゃ入っているとします。例えば
$data =
"<p>\n".
" ほげれ\n".
"</p>\n".
"<pre>\n".
" ここは整形済み\n".
"</pre>";
この$dataを他のhtmlに埋め込むプログラムをつくりました。
そのとき、埋め込んで完成したhtmlのソースが見づらいため、
埋め込む$dataの各行にインデントを加え、埋め込み先のhtmlソースと
幅を合わせます。
$data =~ s/\n/\n /g;
という正規表現で、各行の改行の後ろに次行のインデントを加えてみました。
ところがこの場合、preの中身にも当然インデントが入ってしまい、困っています。
preの中はインデントをかけたくありません。
どういう正規表現で書けばいいでしょうか。
速度はあまり気にしませんが。遅くてもいいので1行の正規表現で書きたいです。
プラットフォームはperl5.8によるCGIです。
0440nobodyさん
04/05/25 01:23ID:???一行は無理だと思う。
0441未承諾広告※ ◆TWARamEjuA
04/05/25 11:33ID:???my $Indent = "\t";
my $data =<<"HTML";
<p>
ほげれ
</p>
<pre>
ここは整形済み
</pre>
HTML
$data =
eval {
my $flag;
join '',
map {
$flag++ if m|<pre>|i;
$_ = $flag ? "$_\n" : "$Indent$_\n" ;
$flag-- if m|</pre>|i;
$_;
} split /\n/, $data;
};
print $data;
眠たいのでごちゃくちゃ、、、スマソ
0442nobodyさん
04/05/25 13:24ID:???0443439
04/05/25 17:16ID:???このコードを眺めて精進します。本当にありがとうございました。
0445nobodyさん
04/05/25 20:15ID:???0446nobodyさん
04/05/30 02:31ID:d8FeFDnu文字列は 'YYYYMMDD-hhmmss', 'YYYYMMDD' の二種類がマッチして、
前者は YYYYMMDD と hhmmss を、
後者は YYYYMMDD と '' (空) を取得したいと思います。
/(\d{8})-(\d{6})/ では後者で取得できませんでした。
どなたかパターンを教えてくださいませ。
0447nobodyさん
04/05/30 02:35ID:???0448nobodyさん
04/05/30 02:47ID:???しかしながら、取得した配列が
前者が YYYYMMDD-hhmmss YYYYMMDD -hhmmss hhmmss
後者が YYYYMMDD YYYYMMDD '' ''
となってしまいました。
欲しいものは
YYYYMMDD-hhmmss から取得したのが YYYYMMDD-hhmmss YYYYMMDD hhmmss
YYYYMMDD から取得したのが YYYYMMDD YYYYMMDD ''
なのです
文を追加することで簡単に直せるのですが、パターンで解決できましたら、
よろしければ後学の為にも教えてくださいませ。
0449nobodyさん
04/05/30 02:50ID:???0452nobodyさん
04/06/04 17:11ID:5ERN6S7Jhttp://www.example.com/aaa/bbb/ccc/foo/bar/
または
http://www.example.com/aaa/bbb/ccc/foo/bar
の「bar」(つまりスラッシュ区切りの一番最後の文字列)
を、$1に格納して、/index.php?cat=$1 [L] を表示するにはどうしたらよいのでしょうか?
試しに以下のようにやっても、404になってしまいました。
RewriteRule (^/+)/?$ /index.php?cat=$1 [L]
どうすれば良いのでしょうか?
0453こうかな?
04/06/04 17:38ID:???0455nobodyさん
04/06/21 10:56ID:DV/+bk/n>>1のリンク先を見たのですが、素人&理数系全くダメの私には理解できませんでした・・・
どなたかアドバイスを下さると嬉しいです。
1-1001までの数字を
1→<a name="1">1</a>
・
・
・
1001→<a name="1001">1001</a>
というふうに置換したいのですが、
検索:[0-9]\f|[0-9]\f[0-9]\f|[0-9]\f[0-9]\f[0-9]\f|[0-9]\f[0-9]\f[0-9]\f[0-9]\f
置換:<a name="\0">\0</a>|<a name="\0\1">\0\1</a>|<a name="\0\1\2">\0\1\2\</a>|<a name="\0\1\2\3">\0\1\2\3</a>
とやっても上手くいきません。(↑笑わないでくださいね。これでも必死なんです・・・)
エディタは秀丸です。どうかよろしくお願いします。
0456nobodyさん
04/06/21 13:16ID:???きっとこんなんじゃ駄目なんだろうな。
0457455
04/06/21 13:20ID:???[0-9]+\f →<a name="\0">\0</a>
これで出来るようになりました。
今度からもっと調べてから書き込みますね。
スレ汚し失礼しました。
0459nobodyさん
04/06/23 14:38ID:StfIGGBa上記の文字列から'test2'の部分だけを取り出したいのですが、
'm /<tag>(.*?)<\/tag>/;' では$1に 'test1<tag>test2' まで入ってしまいます。
'm /<tag>.*?<tag>(.*?)<\/tag>/;' で望みどおりにはなるのですが
エレガントではないように思います。
もっと良い表現はないでしょうか?
0460nobodyさん
04/06/23 15:40ID:???0461460
04/06/23 15:57ID:???0463nobodyさん
04/06/23 18:16ID:???(03/11/19) http://snapshot.publog.net/html/php/2003/11/19/214238.html
(02/11/24) http://pc5.2ch.net/php/kako/1038/10381/1038146241.html
(01/07/26) http://pc.2ch.net/php/kako/996/996105815.html
0464nobodyさん
04/06/24 22:52ID:???http://cgi25.plala.or.jp/~c6h6/em_wiki/index.php?%C0%B5%B5%AC%C9%BD%B8%BD%B7%C7%BC%A8%C8%C4
0465nobodyさん
04/06/25 11:54ID:g4l68VjTと言う文字列があったとして、'B'の2個目の後ろの数字とか、
'A'の3個目の数字などの指定はどうしたら良いでしょうか?
Perlでお願いします。
{m回目にマッチ}を使えば良いかと思ったのですが、使いかたがわかりません。
0466nobodyさん
04/06/25 12:01ID:g4l68VjTm /.{3}(\d)/;
とかで'B'の2個目の後ろの数字は取り出せるのですが、
'A'や'B'はhtmlのタグの変わりですので、任意の文字列の
希望するヒット回数の後ろの文字列を取り出したいと思っています。
0468nobodyさん
04/06/25 12:20ID:???/.*B.*B(\d)/
とかやるしかないんじゃないの?
0469nobodyさん
04/06/25 12:25ID:g4l68VjThtmlの中の2個目のtableタグの中の文字列を取り出したり、
3個目の画像のURLを取り出したりしたいです。
>>468
>つか、{m}はm回数目にマッチじゃないからね。
ご教授ありがとうございます。
0471468
04/06/25 12:36ID:???/(?:.*?B){m}(\d)/
……でもこれってHTML解析とは違うような気がする。
0472nobodyさん
04/06/25 12:46ID:g4l68VjT2個目の<tabe></table>内の10個目の<td></td>の間の文字列を取り出したいのですが、
エレガントな表記方法をお願いします。
>>471
まだまだ初心者なので的確な表現ができなくて申し訳ありません。
自分で調べるとっかかりが欲しかったので、>>465のような質問にしました。
0474nobodyさん
04/06/25 13:15ID:???>>472
そのくらい複雑なことするようなら HTML パースライブラリ使った方が吉。
0475nobodyさん
04/06/25 13:31ID:g4l68VjTぐたい-てき 0 【具体的】
一般的なものや観念的なものではなく、個々の事実によっているさま。
「―に例をあげる」
具体的に例をあげているだろうが。
具体的という意味がわからないならもう帰っていいよ
>>474
>そのくらい複雑なことするようなら HTML パースライブラリ使った方が吉
ご教授ありがとうございます。
HTML パースライブラリというのを知っただけでも大きな収穫を得ました。
0476nobodyさん
04/06/25 13:42ID:???一番必要なのは日本語の勉強だな。
0477nobodyさん
04/06/25 14:10ID:???>2個目の<tabe></table>内
<table><td><table/></td></table><table/>
どれが2個目のテーブルですか。
どこが具体的ですか。
脳内ですか。そうですか。
おめでたい頭してますね。カワイそうに。
0480nobodyさん
04/06/29 20:28ID:8D9V5eyppreg_match("/<a href=(.*)>(.*)<\/a>/i",$str,$str_reg);
これだと、<b></b>があるため、URLとタイトルがうまく抜き取れません。
http://www.abc.com/
<b>ABC</b>company
の2つを抜き出したいのですが、どうしたらいいのでしょうか?
<b>タグが入っていない場合は、うまくいくのですが…。
0483nobodyさん
04/07/03 16:46ID:3JpN2Yosや
DoCoMo/1.0/X503i/c10/ser***********
から
ser**********←これは11〜15桁のユニークな英数字
を得たい。
それと、
http://www.dp.j-phone.com/dp/tool_dl/web/useragent.php
J-PHONE/4.0/J-SH51/SN************ SH/0001a Profile/MIDP-1.0 Configuration/CLDC-1.0
Ext-Profile/JSCL-1.1.0
SN************←12桁のユニークな英数字
を得たい。
よろしくお願いします。
0484nobodyさん
04/07/03 16:48ID:???SN\d{12}
0487nobodyさん
04/07/16 14:35ID:IH9/xCo3アラビア数字(第1条〜第999条)を漢数字(第一条〜第九百九十九条)に置き換える式を教えてください。
0488nobodyさん
04/07/16 15:37ID:ihM1iEsJ「http://hoge.com/***」の***が、先頭一致で(aaa/|bbb/)以外の場合に、
hoge.com/***をhoge.com/index.cgi?***に変換。
〔(aaa/|bbb/)の場合通常のリクエストと見なす〕
〔***は任意〕
Apacheのmod_rewriteで行い、記述は.htaccessで行う。
0489nobodyさん
04/07/16 16:01ID:???.htaccess質問コーナー Part2
http://pc5.2ch.net/test/read.cgi/hp/1084861566/
0490nobodyさん
04/07/16 16:13ID:???【Apache】mod_rewriteについて語るスレ
http://pc5.2ch.net/test/read.cgi/php/1023791370/
というのもありますが、どちらがいいのでしょうか?
0491nobodyさん
04/07/16 17:28ID:???パフォーマンスが悪いのは承知で、
$hage = mb_convert_case($hoge, 'asKV')
$hage = preg_replace('/pattern/', '<span class="match">$0</span>', $hage);
$part = preg_split('/(<.+?>)/', $hage, 0, PREG_SPLIT_DELIM_CAPTURE);
$result = '';
$pos = 0;
foreach ($part as $key => $value) {
if ($key % 2 == 0) {
if (($len = mb_strlen($value)) > 0) {
$result .= mb_substr($hoge, $pos, $len);
$pos .= $len;
}
} else {
$result .= $value;
}
}
というのも考えてみたけど半角の濁点の処理などをさらに追加せねばならず、大変。
mb_ereg_replaceかpreg_replaceのオプションで全角半角を無視ってのできないかなあ。
0493nobodyさん
04/07/17 01:01ID:l2+iEUo8雑多な文字列の入ったテキストファイルの中から、ホスト名を抽出するにはどう書けばいいのでしょう。
実際やりたいことは、テキストファイルからホスト名部分を抽出→ereg_replaceで空白に置換え。
つまりホスト名の削除です。
0495nobodyさん
04/07/17 04:58ID:aixfBR+9以下のような文字列にて"#"より後ろの文字列を
正規表現を使用したeregi_replace関数を用いて全て削除しようと考えています。
("#"も含みます)
$stirng = "あいうえおaiueo#かきくけこ"
以下のようにやっていますが、うまくいきません。
$b = eregi_replace("[#.*]","",$stirng);
どのようにすればよいのでしょうか?
0497nobodyさん
04/07/17 11:31ID:l2+iEUo8>>494
各行から以下のような形式のホスト名部分を削除
#####
YahooBB***********.bbtec.net
\\******.ppp.dion.ne.jp
\*****-*****\\****\-acca.tokyo.ocn.ne.jp
\\***\*\.speednet.ne.jp
\\\.\\\.\\\.\\.ap.highway.ne.jp
*=数字 \=アルファベット(大文字小文字混在)
#####
これ以外にも出来るだけ柔軟に対応させたいのです。
スクリプトの行数が多くなるのは覚悟の上です。
0499nobodyさん
04/07/17 14:48ID:TroGWL8bありがとうございます!
本当に助かりました。^^
0500nobodyさん
04/07/17 15:11ID:TroGWL8b配列にする場合、split関数の引数はどのように書けばよいでしょうか?
$b = " 02600 0 1111"
現在、$a=split(" *",$b);でやっておりますが、うまく出来ません。
よろしくお願い致します。
0501nobodyさん
04/07/17 15:15ID:TroGWL8b訂正です。
$a=split(" +",$b);でやっておりますが、うまく出来ません。
補足です。
上記の例の場合、配列$aに以下のように入れたいと思っています。
$a[0]=02600
$a[1]=0
$a[0]=1111
よろしくお願い致します。
0502nobodyさん
04/07/17 15:16ID:TroGWL8bすいません。また訂正です。
$a[0]=1111
↓↓↓↓↓
$a[2]=1111
0503nobodyさん
04/07/17 15:30ID:TroGWL8b出来ました。
スペースの全角と半角の区別をしてなかったのが原因でした。
失礼しました。
0504nobodyさん
04/07/18 10:56ID:???これでダブルクオートに囲まれた文字列に一致すると思うんですが、
ダブルクオートの中にエスケープされたダブルクオートがあると、そこまでで一致終了してしまいます。
当然ですが。
エスケープされた物を無視させるにはどうすればいいですか
0505nobodyさん
04/07/18 11:12ID:???0506nobodyさん
04/07/18 11:45ID:???"foo\"bar" と \ でエスケープするなら
/(?<!\\)"((?:\\"|[^"])*)"/ で $1 に foo\"bar が入る。
…少なくとも Perl 5.005 以降なら。
0508nobodyさん
04/07/18 21:19ID:???でもこれだと
"test\""
これに対応しない・・・
test
になっちゃった・・・・・
0509nobodyさん
04/07/18 22:03ID:???0510nobodyさん
04/07/18 22:14ID:???使用言語とテストコードを書いてくれんと何が悪いか分からんよ。
#!/usr/local/bin/perl
require 5.005;
$_ = '"test\""Test:"\100-", tes"T""t\"e\"S\"t"';
print "$1\n" while /(?<!\\)"((?:\\"|[^"])*)"/g;
print "$1\n" while /(?<!\\)"([^"]*(?:(?<=\\)"[^"]*)*)"/g; # ループ展開版
__END__
0511nobodyさん
04/07/18 22:32ID:???とりあえず、HTMlタグ内とタグ外、コメントとそれ以外に分けて配列化してるんです
言うならば・・・普通のテキストを
#CDATA, tag, tag, tag, comment, #CDATA, comment, tag, comment, tag.......
みたいな感じで。分かりづらかったらすみません
0512nobodyさん
04/07/18 22:33ID:K8gWFvF7undef @tg;
undef @ot;
push @tg, $1 while($str =~ s/(<!--.*?-->)//s);
@ot = split /<!--.*?-->/s, $tmp;
$i = 0;
foreach (@ot){
push str, $_;
push str, $tg[$i++];
}
foreach (@str){
$tmp = $_;
undef @tg;
undef @ot;
undef @strtg;
push @tg, $1 while(s/(<(?:(?:\\"|[^"])*(?<!\\)"(?:\\"|[^"])*")*?>)//s);
@ot = split /(?:<(?:(?:\\"|[^"])*(?<!\\)"(?:\\"|[^"])*")*?>)/s, $tmp;
$i = 0;
foreach $r (@ot){
push ret, $r, $tg[$i++];
}
}
foreach (@ret){
print $i++, $_ if($_ && $_ !~ /\A\s\Z/s);
}
0513nobodyさん
04/07/18 22:33ID:???読みづらくてすみません
0514nobodyさん
04/07/18 23:15ID:???眠いので落ちます・・・・
0515nobodyさん
04/07/18 23:25ID:???サンプル
ttp://koumuinsiken.hp.infoseek.co.jp/
初心者ながら頑張ったのは…
<!-- isweb auto-insert \*/ -->\n.*\n.*\n.*\n.*\n.*\n.*\n.*\n.*\n.*\n.*\n.*\n
すんません_no
0516nobodyさん
04/07/18 23:39ID:???/<!-- isweb auto-insert \*\/ -->.*?<!-- inserted by isweb server\/\* -->/s
こんなんじゃないのか?
0517nobodyさん
04/07/18 23:52ID:???文法はこれに準拠してるみたいですが、上手くいきません…。
0518nobodyさん
04/07/18 23:55ID:???HTML の属性値では " を \ でエスケープしたりせんが。
http://search.cpan.org/dist/HTML-Parser/
http://www.din.or.jp/~ohzaki/perl.htm#HTML_Tag
これ以上はスレ違いになりそうだから余所でやってくれ。
0520nobodyさん
04/07/19 00:02ID:???http://pc5.2ch.net/test/read.cgi/tech/1062152374/478-480n
が関係あるに 300 ペリカ。
0521nobodyさん
04/07/19 00:17ID:???Emeditorとかでマッチのテストしてみたんですが、
/<!-- isweb auto-insert \*\/ -->.*?<!-- inserted by isweb server\/\* -->/s
ではうんともすんとも言いませんでした。
なんか基本的な知識が欠けているような気がします。すんません。_no
0523nobodyさん
04/07/19 00:47ID:???http://www.emeditor.com/jp/help/dlg/find/
http://www.emeditor.com/jp/help/howto/search/search_regexp_syntax.htm
http://pc5.2ch.net/test/read.cgi/software/1087716064/
<!--\s+isweb\s+auto-insert\s+\*/\s+-->(.|\s)+?<!--\s+inserted\s+by\s+isweb\s+server/\*\s+-->
■ このスレッドは過去ログ倉庫に格納されています