正規表現道場@2ch
■ このスレッドは過去ログ倉庫に格納されています
0001ヽ(´▽`)ノ
2001/07/26(木) 09:03ID:???でもperlを使いのなす上で避けて通れない道だったりするかもです。
そこで、スクラップブック的に目に止まったカッコイイ正規表現を
書き留めておこうと言うスレッドです。
質問する時は言語と、得たい結果をなるべく詳しく書いてね。
取り合えず僕が知ってる有用なリンクです。
http://www.din.or.jp/~ohzaki/perl.htm
http://www.kt.rim.or.jp/~kbk/regex/regex.html
もっとイイ(・∀・) リンクは>>2-10さん辺りが書いてくれるカモ・・・・
0713218-228-157-71.eonet.ne.jp
02/10/14 17:53ID:u7YCuldt0715nobodyさん
02/10/14 19:00ID:???与えられた文字の並びの中から、
UUENCODEでファイルの記述になっている部分【だけ】を
正規表現でネグるやり方はありますか?
これ、テキストメールでOEユーザあたり宛に、ファイル送るときに
便利ですが。フィルターするならどうします?
掲示板に投稿されたテキストが、まんま、掲示板管理者に送信される
ケースで、事故が発生したことがあります。ちなみにOTDの掲示板で。
今は対処済みのようなんですが、いったいどうやったんだろうと不思議で。
0716nobodyさん
02/10/14 19:21ID:???「UUENCODEでファイルの記述になっている部分【だけ】を」
日本語がはっきりしませんが、uuencodeされた部分は、beginn
とendで境界付けられています。
0717nobodyさん
02/10/14 23:51ID:???2.@lines=<>;
perlを1.2.のような使い方で
a
b
c
d
を
a\tb
c\td
にするにはどのように書けばいいでしょうか。
s/\n/\t/;
と書く場合、
置換される回数を指定できればやりたいことが実現できるのですが、
そういう手段perlはs演算子に用意されていないと思います。
他の手段でも構わないので、何かアドバイスありませんか?
0718nobodyさん
02/10/15 00:00ID:???0719nobodyさん
02/10/15 00:13ID:???undef $/;
$line=<>;
$line =~ s/((.+?)\n(.+?\n))/$2\t$3/g;
print $line;
0721719
02/10/15 00:35ID:???while(<>) {
chomp;
if ($. % 2) {
print $_, "\t";
} else {
print $_, "\n";
}
}
かなぁ。
0724717
02/10/15 01:52ID:???a b c
d e f
g h i
j k l
とかも作る必要があったので、721のものが一番
良かったかも。
汎用性?
0726nobodyさん
02/10/15 02:53ID:epeKbC4J0727nobodyさん
02/10/15 03:22ID:???0728726
02/10/15 10:55ID:Hi0tGOTs正規表現のみでひとつ
0729nobodyさん
02/10/15 11:00ID:LkwD4Abx/[-_.a-zA-Z0-9]+@(?:[-a-zA-Z0-9]+\.)?[-a-zA-Z0-9]{3,63}\.(?:[a-z]{2,}\.[a-z]{2}|[a-z]{2,})/
0730nobodyさん
02/10/15 12:28ID:???某サイトでお願いして書いてもらったソースコードを実行するたびに、
掲示板が勝手に改行いれるので、それを消し去る正規表現を書きたいです!!!
規則は:
1.全ての行は本来ならスペースやタブで始まる
2.勝手に改行されていた行は先頭(^)から始まる
3.本来なら、各行の先頭は大文字である
4.勝手に改行されていた行は先頭が小文字である
ぐらいかな〜。
具体例:
Cells.Find(What:="場所", After:=ActiveCell, LookIn:=xlValues, Look
At:= _
xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchC
ase:=False) _
.Activate
のような感じです。お願いしました。
0731730
02/10/15 12:30ID:???3.本来なら、各行の先頭は大文字である
4.勝手に改行されていた行は先頭が小文字である
には例外があるみたいです。
御願いしましたよ。
0732nobodyさん
02/10/15 14:22ID:???文字のパターンは、
1:****** # 文字数未定の1文字以上の半角数字
2:***-*** または、 ***-***-*** # 文字数は未定の数字のあとにハイフンが入ります。
ハイフンは1個の時と、2個付くときがあります。
例)12344556 、 32-98 、 45-98-35
これらの正規表現をお願いします。
自分で考えたのは
([0-9]+[[\-[0-9]+]?[\-[0-9]+]?) これです。
一応成功するんですが、**-**-**-** こうやっていくつも続いた時も
マッチしてしまいます。基本的に**-**-**という風に三回しか繰り返しません。
修正があればお願いします。
0733nobodyさん
02/10/15 14:26ID:???([0-9]+[\-[0-9]+]?[\-[0-9]+]?)/mg)
0734nobodyさん
02/10/15 14:29ID:???0735nobodyさん
02/10/15 19:18ID:???$in{$_} =~ s/^begin 0{0,1}[0-9]{3} (?:(?!\nend).)*(\nend)/UUENCODED-BINARY/gs;
$in{$_} =~ s/\nbegin 0{0,1}[0-9]{3} (?:(?!\nend).)*(\nend)/\nUUENCODED-BINARY/gs;
うちではこうだけど。でも取り除き漏れがあるかな?うぅーん。
0736726
02/10/16 21:41ID:lp+sZlkXありがとう
0737nobodyさん
02/10/17 02:55ID:???0738nobodyさん
02/10/18 23:47ID:???日本語のひらがな一文字だけマッチさせるのって出来るのですか?
0739nobodyさん
02/10/18 23:51ID:???0740nobodyちゃん
02/10/19 01:06ID:???jperlなら、[ぁ-ん]
perlなら、sjisの場合、\x82[9F-F1]、
eucの場合、A4[A1-F3]、jisの場合、24[21-73]、utf8の場合、30[41-93]
0741nobodyちゃん
02/10/19 01:08ID:???perlなら、sjisの場合、\x82[\x9F-\xF1]、
eucの場合、\xA4[\xA1-\xF3]、jisの場合、\x24[\x21-\x73]、
utf8の場合、\x30[\x41-\x93]
0742nobodyさん
02/10/19 13:03ID:???HTMLの<TABLE>〜</TABLE>をCSVとかTSVとかに変換できますか?
table2csv.pl
なんてのがあるわけがないと思って質問シマスタ。
w3m -dump はへんな線が入るので、使いたくないし、CSVが勝つよう範囲も
広そうなので、だれか書いていてもよさそう。
とっても困ってます。
0743738
02/10/19 13:16ID:???perl(jperl and perl5.8)の
s/あ/ア/;
tr/あ/ア/;
の違いってわかりますか?
たぶん、知ってそうだから。ごめんね。
0744742
02/10/19 13:36ID:???になんかそれっぽいものあるけど
動かない。
理由わかる人いますか?
0746nobodyさん
02/10/19 15:15ID:???ほれ。区切りはawkだから-F","とかね。
BEGIN { print "<table border=\"1\">";}
{
print "<tr>";
for (i=1; i<=NF; ++i){
gsub(/&/,"\\&",$i);
gsub(/</,"\\<",$i);
gsub(/>/,"\\>",$i);
print "<td>" $i "</td>";
}
print "</tr>\n";
}
END { print "</table>";}
0748744
02/10/19 18:08ID:???0749744
02/10/19 18:39ID:???0751nobodyさん
02/10/19 21:52ID:???colspanとrowspanが指定されてるのってどうするかとか、
仕様が決まれば、すぐ書けるよ。特にrowspanね。
caption、thead、tfootどうするかは、たいした問題じゃ
ないな。
libraryやmoduleがないのは、余りにも簡単だからだよ。
perl初心者コーナーで質問したら書いてくれる人いっぱい
いたのにぃ。
0753nobodyさん
02/10/20 11:10ID:???例えば、
┌─┬─────┬─────┐
│ │ 人間 │ 猿 │
│ ├──┬──┼──┬──┤
│ │ 男 │ 女 │オス│メス│
├─┼──┼──┼──┼──┤
│x │ 1.9│ 2.3│ 1.3│ 1.8│
├─┼──┼──┼──┼──┤
│y │ 0.8│ 0.4│ 0.4│ 0.2│
└─┴──┴──┴──┴──┘
だったら、
"," (row: 2)","人間 (cols: 2)","人間 (cols: 2)","猿 (cols: 2)","猿 (cols: 2)","
"," (row: 2)","男","女","オス","メス","
","x","1.9","2.3","1.3","1.8","
","y","0.8","0.4","0.4","0.2","
こんなふうにするスクリプト。改行多くて1レスにならんから、次レスへ。
0754nobodyさん
02/10/20 11:10ID:???while(<>) {
chomp;
$flg = 0;
$col = 0;
$line = $_;
$line =~ s/(<\/*thead>|<\/*tfoot>)//gi;
$line =~ s|</*tr.*?>||gi;
for $i (0 .. $#row_max) {
undef $row_data[$i] if $. > $row_max[$i];
}
while($line =~ /<(td|th)/) {
$flg = 1;
$col++;
$line = "$'$row_data[$col]$&$`";
if ($line =~ s|<t[dh][^<]+?rowspan.+?(\d+).+?>(.*?)</t[dh]>|"\",\"" . $2 . " (row: " . $1 . ")"|ei) {
$row_data[$col] = "<td>$2 (row: $1)</td>";
$row_max[$col] = $. + $1;
} elsif ($line =~ s|<t[dh][^<]+?colspan.+?(\d+).+?>(.*?)</t[dh]>|("\",\"" . $2 . " (cols: " . $1 . ")") x $1|ei) {
1;
} else {
$line =~ s|<t[dh][^<]*?>(.*?)</t[dh]>|","$1|i;
}
}
print "$line\",\"\n" if $flg == 1;
}
しっかり試してないからバグが潜んでいるかも。
0756744
02/10/20 22:50ID:???おおおお、そんな複雑なことまで出来るのですね。
ほんとに有難うございました!!!
勉強になりました。
今、http://hywr.kuciv.kyoto-u.ac.jp/~shiiba/documents/unix/openmemo.html#3
のtabel.elなるものを見つけましたが、スクリプト自体は落とせませんでした。
以前これを落とされた方いますか?
0759nobodyさん
02/10/21 12:36ID:???テーブルにこんなタグあんのか?
0760nobodyさん
02/10/21 12:47ID:???>>759
あるぞぉ。
ちなみに、tr/th/tdタグって閉じなくてもいいわけだから、汎用的に使う場合に
はちょっと問題出そうな気がするんだけども。
あるよ。あとtbodyね。省略可能だからあまり見ないのかも。
0763nobodyさん
02/10/21 14:31ID:+QmxDt3y何故か全角のスラッシュだけが置き換えされません・・
なんででしょうか?
$_ =~ s////g;
これでいいんですよね?
0764nobodyさん
02/10/21 15:06ID:???>>763
まず、lintで正しいhtmlかどうか確認しましょう。
>>762
ちなみに、あんたの予測ではどういう時に無限ループに陥る?
>>761
tbodyでtd、thと同じ行で共存しないでしょ。
$flg==1のとき(その行にtdかthがある場合)しか出力してないから
tbodyは無視していいのです。<\/*tfoot>の削除も実は不要だった。
>>760
<\/*thread>ってなってるでしょ。閉じはあってもあくても対応できるよ。
だれも書いてないことは、<tr>...</tr>の行が一行毎に改行されてない
のにかけたら、まったくだめだよってこと。その前処理を付ければ、
すばらーしスクリプトだな。
0765nobodyさん
02/10/21 15:49ID:???おっとうっかりしてた。
</*thead>とかじゃなくて、tr,td,thか。
それが閉じてないとやばいね。多分、lintには叱られるhtmlの書き方
だろうけど。それに対処するには、td,thのばやいは、次のtd,thか、改行まで、
trはもともと削除しちゃってるんだから関係ないと。
だから、上のスクリプトに
s#</t[dh]>#(</t[dh]>|<t[dh]>|$)#g;
すればいいっつことだな。
0766nobodyたん
02/10/21 18:17ID:???乗り遅れたが...
while(<>){
s/(.*?)[\r\n]*$/$1."\t".<>/es;
print;
}
ってのはどう?
0767nobodyさん
02/10/21 23:29ID:pPxXD5oZ一文字前が改行以外の「,」を検索することは
正規表現で出来るのでしょうか?
VBScriptの正規表現オブジェクトを使ってます。
[^\t\n],
だと改行が前に無い「,」とその一個前が取れてしまって・・・。
重ね重ね厨ですみません。。
0768nobodyさん
02/10/21 23:31ID:???0769主婦のサークルで〜す
02/10/21 23:55ID:Ah6hwMht私たち主婦が楽しめる安全でちょっとトキメキのある出会を求めて
只今男性会員を募集中です!! 女性会員も募集(^○^)/"
http://f-cc.com/~tokimail/
0770762
02/10/22 00:35ID:???以下の2行のごく単純なテーブルで実行してみれば?
<table><tr><td
bgcolor="White">hoge</td></tr></table>
あと、念のために聞くけどCSVって知ってる?
0772nobodyさん
02/10/22 05:13ID:???ちゃんと人の書いてること読んでから書き込め。
<tr>...</tr>の行が1行ごとに改行されてるtableが前提だ。
前処理もすぐに書けるが書いてないといってる。
お前のおかげで貴重な資源が無駄になった。もう2chには来るな。
おまえはCSVに何種類かあるか知ってるのか?漏れの出したの何ていう
名前のCSV? Kで始まるよ。
そういうのが分かってる奴しか相手にしないからお前は早く氏ね。
0774nobodyさん
02/10/22 07:58ID:???まーまーおちけつ。
故意にせよ抜けてたにせよ、問題を含んでるのは確かなんだから、
より実用的なコードに仕上げた方が建設的ってもんでないかい?
0775nobodyさん
02/10/22 10:53ID:???<table>
<thead><tr><th>1</th><th>2</th><th>3</th></tr></thead>
<tfoot><tr><th>4</th><th>5</th><th>6</th></tr></tfoot>
<tbody>
<tr><td>7</td><td>8</td><td>9</td></tr>
<tr><td>A</td><td>B</td><td>C</td></tr>
<tr><td>D</td><td>E</td><td>F</td></tr>
</tbody>
</table>
の表示は
1 2 3
7 8 9
A B C
D E F
4 5 6
になるのでよろしく
0776nobodyさん
02/10/22 11:51ID:???while(<>) {
chomp;
$flg = 0;
$col = 0;
$line = $_;
$line =~ s/(<\/*thead>|<\/*tfoot>)//gi;
$line =~ s|</*tr.*?>||gi;
for $i (0 .. $#row_max) {
undef $row_data[$i] if $. > $row_max[$i];
}
while($line =~ /<(td|th)/) {
$flg = 1;
$col++;
$line = "$'$row_data[$col]$&$`";
if ($line =~ s|<t[dh][^<]+?rowspan.+?(\d+).+?>(.*?)</t[dh]>|"\",\"" . $2 . " (row: " . $1 . ")"|ei) {
$row_data[$col] = "<td>$2 (row: $1)</td>";
$row_max[$col] = $. + $1;
} elsif ($line =~ s|<t[dh][^<]+?colspan.+?(\d+).+?>(.*?)</t[dh]>|("\",\"" . $2 . " (cols: " . $1 . ")") x $1|ei) {
1;
} else {
$line =~ s|<t[dh][^<]*?>(.*?)</t[dh]>|","$1|i;
}
}
print "$line\",\"\n" if $flg == 1;
}
0777nobodyさん
02/10/22 12:04ID:???0778nobodyさん
02/10/22 13:28ID:???やっぱり、CSVにはスペース区切りしかないと思ってたのか。
教えといてやる。スペース区切り、タブ区切り、コンマ区切り、K3形式...
おまえみたいなうすまぬけな変換だと
<tr><td>おまえは馬鹿 糞馬鹿</td><td> お前はアフォ 大アフォ</td></tr>
<tr><td>おいらはK3</td><td>他にどんな形式あるか知ってるか? 何も知らなきゃ黙ってろ</td></tr>
は、
おまえは馬鹿 糞馬鹿 お前はアフォ 大アフォ
おいらはK3他にどんな形式あるか知ってるか? 何も知らなきゃ黙ってろ
こんなんなっちゃって、桁が合わなくなって使いみちないよ。
おまえの単純なデータを漏れのすばらーしスクリプトで変換するとこうなる。
","1","2","3","
","4","5","6","
","7","8","9","
","A","B","C","
","D","E","F","
どこにいちゃもん付けたいんだ。
0779nobodyさん
02/10/22 13:55ID:???>>778
775は一例でスペース区切り上げただけかもしらんだろ。
そもそもnobodyばっかで訳わかんねぇよ。
議論したいならトリップつけるか、自分が書き込みした最初の記事の番号ぐらい名乗れよ。
>>763 なんかtableとかCSVとかと何も関係なく質問しただけかもしれんのに、HTML-lintとか
ワケワカな答えされてるし。
傍から見てウザ過ぎ。
>>763
$_ =~s/\Q/\E//g;
って\Qと\EでくくればOK。
0780754=778
02/10/22 14:13ID:???あんたは喧嘩両成敗みたいなことやってるが、明らかに
悪いやつは、何の欠陥を指摘もできないで、漏れのスクリ
けち付けた>>757、>>775。
>>776は、すばーらしスクリをさらしてくれてありがd。
「>>754はすばらーし」、だけでよかった。>>776も考えて
みりゃ、ネットのくずだ。早く逝け。
0781nobodyさん
02/10/22 14:24ID:???そうやって熱くなって他の人間にまで迷惑を掛ける。
いくらお前から見て>>757、>>775が悪でも、傍から見たら一括りにしてウザイんだよ。
そこんトコ分かってくれ。
0782754=778
02/10/22 14:26ID:X4lK8otn漏れは自宅のLINUXでやってた。ほんで、>>778は、会社の
Solarisでやった。ちょっと気になって、winでやったら、
こうなった。
","1","2","3
","4","5","6
","7","8","9
","A","B","C
","D","E","F
つまり、\x0d\x0aの改行コードがchompでは1個しか取れなくて、
print "$line\",\"\n" if $flg == 1;
で後ろに付くべき","が消えている。付いてるんだけど表示されない。
もう少し、修行を積むことだな。
0783nobodyさん
02/10/22 14:26ID:???0784754=778
02/10/22 14:44ID:???<table border="1">
<tr><td>おお</td><td>いい</td><td>うう</td><td>ええ</td><td>おお</td></tr>
</table>
は、
┌──┬──┬──┬─────┬─────┐
│おお│いい│うう│ええ</td>│おお</td>│
└──┴──┴──┴─────┴─────┘
になっちゃうけど?
それとも、漏れにhtml2csvじゃなくって、html-lint書けって言うわけ?
まったく別の質問だと思ってたけど?
ちなみに、
$_ =~ s////g;
eucではperlで問題無いけど、sjisでは、/が815Eだから、1バイト文字と重なるね。
81の00と5Eの^に。で、エスケープした方がいい?
0785754=778
02/10/22 14:48ID:???そうそう、sjisで日本語やってんなら、jperlにしたら、こいうこと
気にしなくていいんじゃない、って書こうと思ったんだ。
0786779
02/10/22 15:53ID:???へぇ、>>763はHTMLの話なんだ。どこからその毒電波でたの?
>>785は同意だけど。
あと君のスクリプトサラッと見てみたけど、colspanとrowspanの2つとも指定されたtdを含む場合
(<td colspan="2" rowspan="2">ほげ</td>ってみたいなの)、問題あるような気がするけど。
0787754=778
02/10/22 16:34ID:???それは考えてませんでした。うすうす気づいてたけど。
そういうまともな批判を待ってました。ありがd。
<tr>...</tr>の途中で改行されてるデータと、solspan、rowspanが両方
指定されてるデータに対応したのを作ってみます。比較的すいてるので、
この前は上げたけど、不評なので、上げるかどうか分かりません。
0788nobodyさん
02/10/22 17:48ID:???0789nobodyさん
02/10/22 17:53ID:???・多分改行も関係ない
・多分バグある
・多分滅茶苦茶叩かれるw
http://homepage3.nifty.com/~moemoe/table2csv.pl.txt
0792789
02/10/23 01:50ID:???自分で書いといて何だがもっとコンパクトに書けそうな気がしたんで
添削キボンなんだが。
ってココまで行くと正規表現の範囲でも無いか。sage
0793754=778
02/10/23 02:53ID:???使い方を示した。rowspanだけは難しかったので配列をつかっちゃった。
>>754は、10分か20分で作ったので、さっき改行とcolspan、rowspanに
対応したのを配列なんか使わずに書いたが・・・
Perlのスクリプトを競うのなら「スクリプト改造工房」、「Perl
初心者コーナー」あたりにどうぞ。
0794775
02/10/23 03:05ID:???4 5 6
が2番目ではなくて最後になるってことで
区切りなんてどうでもよかったんでIEの表示結果を
コピペしただけだったんですが
0796754=778
02/10/23 03:31ID:???0797nobodyさん
02/10/23 10:13ID:???perlメモを見ましたが初級者にはどう考えても理解できません。
別に理解しなくてもサブルーチンとして貼り付ければいいだけかもしれないんですが、
ある程度何をやっているかわからないとやっぱり気分が悪いです。
で、皆さんが普段利用しているメールアドレスチェック正規表現を教えていただければこれ幸いです。
0798ぶっちー
02/10/23 10:36ID:IaWkOnQn文字列を「 [999KG] 」のように[]で囲みたくて正規表現を使って置き換え
してるんですがうまくいきません・・・
「オレ様,男,25才,189cm,98KG,12%」
みたいなカンジでカンマで区切ってある行が2000行くらいです。
この中の体重部分だけを[]で囲みたいんデス(泣;
0800789
02/10/23 11:13ID:???・改行関係のバグ
・余計なタグの削除
・その他
スレ違いなのでもうココまで。
>>794
漏れのは多分大丈夫かと。
>>797
$mail =~/^[0-9a-zA-Z_\.-]+@([a-zA-Z0-9][a-zA-Z0-9_-]*\.)+[a-zA-Z]{2,}$/;
>>798
v.3.00以降のみ対応。
・検索:,\f[0-9]*KG\f
・置換:,[\1]
,が付いてるのは名前のトコにも数字KGってくる可能性があるので。
0801nobody
02/10/23 11:23ID:???正規表現道場だから、
s/((.*?,){4})(.*?),/$1\[$3\],/;
しかし、普通は、配列を使って、
split/,/;
print "$_[0],$_[1],$_[2],$_[3],[$_[4]],$_[5]";
0802ぶっちー
02/10/23 11:34ID:IaWkOnQn神!できました!
どうもありがとうございましたヽ(´∀`)ノ
「タグ付き正規表現」ってヤツですね。
ま、それ知ってても自分でできたとは思えませんが・・・
0803ぶっちー
02/10/23 11:41ID:IaWkOnQn>>798サマ
>>801サマ
PG上でのマッチングじゃなくて秀丸で成形してから
SQLに渡そうと腐心しておりマスタ。いずれにせよ
ソース上で有用な構文、ありがとうございました!
0804nobodyさん
02/10/23 12:17ID:???0805nobodyたん
02/10/23 12:49ID:???と思ったり。
変に不完全なチェックするよりマシ。
0807nobodyさん
02/10/23 17:24ID:???どうしようもないわけだが
0808nobodyさん
02/10/23 17:57ID:???0810nobodyさん
02/10/23 20:28ID:???みたいに出来ますが、
「ある文字列を含まない」ってどうやるんですか?
0811nobodyたん
02/10/23 21:06ID:???(バックトラックしつつ、) 前から順番にマッチさせていって、最後まで行っ
たら受理されるってのが正規表現だから。
でも、perl の拡張正規表現を使えば出来てしまうのが気持悪いところ。
print "ok\n" if(/^(?!.*xyz)/); # "xyz" が入っていなければ表示される。
先頭の後ろに「任意の個数の文字に "xyz" が続く文字列」が来ないものにマッ
チ。= "xyz" を含まない文字列にマッチ。
0812nobodyさん
02/10/24 00:07ID:???print "ねーよ" if ($str !~/xyz/);
とか
print "ねーよ" unless ($str =~/xyz/);
じゃ問題あんの?
■ このスレッドは過去ログ倉庫に格納されています