正規表現道場@2ch Part2
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
02/11/24 22:57ID:LrbVcl3Yこのスレは有用そうな正規表現を紹介したり、どう表現したらいいかわからないときに
質問をしたりするためのスレッドです。
質問するときは使用言語や得たい結果をなるべく詳しく書きましょう。
リンクなどは>>2-5のあたりに。
0479435
03/05/11 19:08ID:???それじゃ進歩しないぞ。ここは道場だからな。ビシビシいくぞ!
馴れ合いスレじゃないからな。
もちろん漏れが書いたのもまだ不完全なのかも知れん。つっこみどころが
あればつっこんでもっといいものを出せばいいんだ。
0480あぼーん
NGNG0481456
03/05/11 19:14ID:???じゃあ意味の無い点数なんて付けるな。
第一、処理対象となる HTML がどんな仕様なのか前提があいまいで、
あとからコレはダメだアレはダメだなんてのは、
単にいちゃもん付けたいだけとしか思えん。
だったら最初から parse 対象 HTML を全て提示しとけ。
0482435
03/05/11 19:21ID:???いちいち見ず知らずの漏れが付けた点数に反応してどうするよ。
おかしいと思えば無視しろよ。
HTMLの仕様は決まってるだろ。今まで書いたことがいちゃもんだといわれ
ても、漏れがやってるプログラミングの世界ではあらゆる状況を考慮しないと
とんでもないバグになってしまうから、まア職業病だと思ってくれ。
0483456
03/05/11 19:28ID:???> HTMLの仕様は決まってるだろ。
だから漏れが <a> はネストしないって言ったら、 >>457 と言う。
だったらお前の脳内HTML仕様を提示しろと言ってるんだYO!
とんだ職業病だな。
0485nobodyさん
03/05/11 19:45ID:???だから、わざと冗長な正規表現をかいただけのはなしだが・・・
^^^^^^
手前ルールでやられりゃ、腹も立つやろうなぁ・・・
0486あぼーん
NGNG0487nobodyさん
03/05/11 20:20ID:???0488名無しさん@Meadow
03/05/12 07:34ID:???486みたいな香具師は2chでは普通ですが、何か。
0490nobodyさん
03/05/12 09:37ID:???0492nobodyさん
03/05/12 10:28ID:85k2ng51ここまでやるってのはどう?
/<(?:!(?:--[\s\S]*?--\s*)*(>)\s*|(?:script|style|SCRIPT|STYLE)[\s\S]*?<\/(?:script|style|SCRIPT|STYLE)>)/isg;
0493nobodyさん
03/05/12 10:47ID:???iつけるんなら、
/<(?:!(?:--[\s\S]*?--\s*)*(>)\s*|(?:script|style)[\s\S]*?<\/(?:script|style)>)/isg;
これでいいんでない?
[\s\S] って .でいいんちゃうかな?
0494nobodyさん
03/05/12 10:53ID:85k2ng51そうだね、指摘サンクスコ(・∀・)
漏れのソース、i付いてなかった(;´Д`)
0495nobodyさん
03/05/12 10:54ID:85k2ng51ありとあらゆるサイトのコメント入りHTML食わせてみたけど、
まず間違いなく削除してくれる。
100%ではないかもしれないけど。
0496あぼーん
NGNG0497nobodyさん
03/05/12 22:56ID:???0498nobodyさん
03/05/19 22:15ID:pDSpAcPJ正規表現はどう書けばいいのでしょうか。
たとえば下のフルパスからhttpd.confだけを取り出すような場合です。
C:\Program Files\Apache Group\Apache\conf\httpd.conf
0499あぼーん
NGNG0501あぼーん
NGNG0502nobodyさん
03/05/19 22:58ID:???perlなのですがエラーになりました。
-----test.pl------
my $path = $0;
$path =~ \\([^\\+])$;
print "\$path :\n";
print "$path\n";
----------------
0504nobodyさん
03/05/19 23:23ID:???$a='C:\Program Files\Apache Group\Apache\conf\httpd.conf';
($_)=$a=~ /^.+\\(.+)$/;
print;
0505nobodyさん
03/05/19 23:26ID:???すいません。
改めて試しましたがファイル名test.pが取得できません。
-----test.pl------
my $path = $0;
print "$path\n";
$path =~ /\\([^\\+])$/;
print "\$path :\n";
print "$path\n";
----------------
0506500
03/05/19 23:33ID:???× \\([^\\+])$
○ \\([^\\]+)$
>>505
typoに関係なくそのスクリプトは間違っている。
もう一回本読め。
0507nobodyさん
03/05/19 23:42ID:???さっそく試してみました。
しかしフルパスが入ります。
環境は98です。
-----test.pl------
my $path = $0;
print "$path\n";
$path =~ /^.+\\(.+)$/;
print "\$path :\n";
print "$path\n";
----------------
>>506
ダメでした。
スクリプト自体が間違っていますか?
-----test.pl------
my $path = $0;
print "$path\n";
$path =~ /\\([^\\]+)$/;
print "\$path :\n";
print "$path\n";
----------------
0510nobodyさん
03/05/19 23:52ID:???0512nobodyさん
03/05/20 00:33ID:???500へのお礼を忘れてました。
確かに拾えます。
ですがまだ不具合があるので両方の正規表現を使って試している最中です。
-----test.pl------
my $path = $0;
print "$path\n";
($_)= $path =~ /\\([^\\]+)$/;
print "\$path1 :\n";
print "$_\n";
$a='C:\Program Files\Apache Group\Apache\conf\httpd.conf';
($_)=$a=~ /^.+\\(.+)$/;
print;
----------------
0513nobodyさん
03/05/20 00:38ID:???0514nobodyさん
03/05/20 01:10ID:???$a='C:\Program Files\Apache Group\Apache\conf\httpd.conf';
perl test.plというようにカレントディレクトリから実行して下のような値が入った場合はファイル名を取得できません。
$b='httpd.conf';
$a='C:\Program Files\Apache Group\Apache\conf\httpd.conf';
$b='httpd.conf';
両方の値からhttpd.confだけを抜け出せないでしょうか。
スレ汚しで申し訳ないです。
0515nobodyさん
03/05/20 01:11ID:???my $path1 = $0;
print "$path1\n";
($_)= $path1 =~ /\\([^\\]+)$/;
$path1 = $_;
print "\$path1 :\n";
print "$path1\n\n";
my $path2 = $0;
print "$path2\n";
($_)= $path2 =~ /^.+\\(.+)$/;
$path2 = $_;
print "\$path2 :\n";
print "$path2\n\n";
$a='C:\Program Files\Apache Group\Apache\conf\httpd.conf';
($_)=$a=~ /^.+\\(.+)$/;
print "\$a :\n";
print;
print "\n";
$b='httpd.conf';
($_)=$b=~ /^.+\\(.+)$/;
print "\$b :\n";
print;
#--------------------------------------
0516nobodyさん
03/05/20 09:12ID:???print "$1";
っていうか use File::Basename; 使え。
0518515
03/05/20 12:30ID:???my $path1 = $0;
print "$path1\n";
($_)= $path1 =~ /\\([^\\]+)$/;
$path1 = $&;
print "\$path1 :\n";
print "$path1\n\n";
my $path2 = $0;
print "$path2\n";
($_)= $path2 =~ /^.+\\(.+)$/;
$path2 = $&;
print "\$path2 :\n";
print "$path2\n\n";
my $path3 = $0;
print "$path3\n";
($_)= $path3 =~ /[^\/\\]+$/;
$path3 = $&;
print "\$path3 :\n";
print "$path3\n\n";
my $path4 = $0;
print "$path4\n";
($_)= $path4 =~ /([^\\]\+)$/;
$path4 = $&;
print "\$path4 :\n";
print "$path4\n\n";
#--------------------------------------
0519515
03/05/20 12:33ID:???$a='C:\Program Files\Apache Group\Apache\conf\httpd.conf';
($_)=$a=~ /[^\/\\]+$/;
print "\$a :\n";
print "$&\n";
print "\n";
$b='httpd.conf';
($_)=$b=~ /[^\/\\]+$/;
print "\$b :\n";
print "$&\n\n";
$a='C:\Program Files\Apache Group\Apache\conf\httpd.conf';
($_)=$a=~ /([^\\]\+)$/;
print "\$a :\n";
print "$&\n";
print "\n";
$b='httpd.conf';
($_)=$b=~ /([^\\]\+)$/;
print "\$b :\n";
print "$&\n";
#--------------------------------------
スレ汚しに付き合って頂いて感謝でした。
0520nobodyさん
03/05/20 12:47ID:ridin1oOuse File::Basename;
$path = 'C:\Program Files\Apache Group\Apache\conf\httpd.conf';
$file = basename($path);
print $file;
0521あぼーん
NGNG0522山崎渉
03/05/22 01:59ID:???0523nobodyさん
03/05/25 03:32ID:???0524あぼーん
NGNG0525山崎渉
03/05/28 17:06ID:???ピュ.ー ( ^^ ) <これからも僕を応援して下さいね(^^)。
=〔~∪ ̄ ̄〕
= ◎――◎ 山崎渉
0526nobodyさん
03/06/06 19:09ID:GD1DFdBg[a-zA-Z0-9,\?]
で良いのでしょうか。
やりたいことは、↓です。
function check($address){
if ( ereg("^[a-z,A-Z,0-9,\(,\),\.,\_,\/,\+,\?,\-]+@[^.@!\"#$%&'()~^|]+\.[^@!\"#$%&'()~^|]*[^.@!\"#$%&'()~^|]$", $address)){
return true;
}
else{
return false;
}
}
$email_1 = "a(a)a?_s-/[email protected]";
$email_2 = "a(a)a_s-/[email protected]";
$email_1も$email_2もtrueが返ってきてほしいのに、
$email_2のみがtrueで返ってきます。。
?そのもにをマッチさせるにはどうすれば良いのでしょうか。
0527あぼーん
NGNG0530526
03/06/09 10:45ID:???はい。PHPです。どちらもtrueが返るようになりました。
原因は、「if ( ereg("^[a-z,〜〜〜」を通す前にさらにチェックしていてそこで引っかかっていました。
正規表現とは関係なくてすいませんでした。
>>529
そこはperlだったのですが参考になりそうなページでした。ありがとうございました。
0531yoko
03/06/10 13:46ID:QvCU0It/以下のような形式のテキスト ファイルを扱っています。生徒から備考までを
1 ブロックとして、生徒番号 800 までのブロックがあります。本当は XML か
CSV で管理するべきだと思うので近いうちに変換する予定です。
生徒: 1名前: 田中得意科目: 数学苦手科目: 古文備考: 2 学期より編入
生徒: 2名前: 山田得意科目: 国語苦手科目: 世界史備考: 模試未受験
生徒: 3
..
今正規表現をつかって各データの手直しをしているのですが、とても簡単なと
ころでつまづいています。
"生徒: 2" から "生徒: 2." という具合に、生徒行の数字の後ろにピリオドを
つけたいのですが、どのような表記で置換処理をしていいのかわかりません。
"生徒: [[0-9]+|[02-9]]" で "生徒:" とその数字部分を検索でヒットするこ
とはできるのですが、これを "生徒: [[0-9]+|[02-9]]." で置換しても "生徒:
[[0-9]+|[02-9]]." に入れ替わるだけです。大きな勘違いをしているとは思
うのですが…正規表現の資料をみてもここから先に進むことができません。
すごくつまらない質問だとは思いますが、どなたかみていただけないでしょう
か。
0532yoko
03/06/10 13:48ID:???書き直します。
生徒: 1
名前: 田中
得意科目: 数学
苦手科目: 古文
備考: 2 学期より編入
生徒: 2
名前: 山田
得意科目: 国語
苦手科目: 世界史
備考: 模試未受験
生徒: 3
..
0533nobodyさん
03/06/10 13:56ID:wps94NoxAAAAA http://www.a.com/
BBBBB http://www.b.com/
CCCCC http://www.c.com/
というタイトルとURLのペアのファイルがあるとします。
で、例えば
「AAAAAはBBBBBでCCCCC」
というテキストを
「<a href="http://www.a.com/">A</a>は<a href="http://www.b.com">〜」
みたいに変換したいです。
上記のペアでしたら、順に検索して置換すれば済むことですが、もし
最後の方に下記みたいなペアがあると
href http://www.href.com/
「<a <a href="http://www.href.com">="http://www.a.com〜」
のように変換されてしまいます。
こういう場合はどうすればいいんでしょうか?
できればそれぞれの置換したい単語が元のテキストを参照できるようにしたいです。
0534nobodyさん
03/06/10 14:34ID:???おそらく秀丸のヘルプ嫁。かと。
正規表現の互換があるかどうか判らないが Perl だと、
s/(生徒: \d?\d)/$1\./g; 等。
>>533
チョソなのでニポンコよくわからないてす。
ニポンコむつかしにだ。
0535nobodyさん
03/06/10 23:58ID:???ヘルプ開いて「タグ付き正規表現」というのを読めば幸せになれるかと
0536nobodyさん
03/06/11 01:31ID:???#!/usr/local/bin/perl
my $text = "AAAAAはBBBBBでCCCCCなhrefさ";
my %dictionary = (
"AAAAA" => "http://www.a.com/",
"BBBBB" => "http://www.b.com/",
"CCCCC" => "http://www.c.com/",
"href" => "http://hre.f.com/",
);
my $pattern = join('|', map { quotemeta($_) } keys(%dictionary));
$text =~ s/(${pattern})/<a href="$dictionary{$1}">$1<\/a>/g;
print "[$text]\n";
0537nobodyさん
03/06/11 02:54ID:???0538yoko
03/06/11 13:19ID:FQ/QXZetありがとうできました!
チュパ (←フェラ)
0542nobodyさん
03/06/11 16:25ID:u2aqyjyIすみません、一つ質問させてください。
HTMLファイル内のアンカータグで指定されているURLを全てエンコードして返すコードを書きましたが、どうも思う
ように動いてくれません。問題のコードは下記となっております。
-----------------------------------------------------
while(<FH>){
if($_ =~ /\<a.*?href.*?\=.*?\>/ig){
my $tmp = $_;
while($tmp =~ /(.*\<a.*?href.*?\=)(.*?)(\>.*?)(\<|\n)/ig){
my $tmp1 = $1; my $tmp3 = $3;
my $tmp2 = main::url_encode($2);#エンコードルーチン
$tmp2 =~ s/\%20//g; $tmp2 =~ s/\%22/\"/g;
$index_file .= $tmp1 . $tmp2 . $tmp3;
}
}
else{
$index_file .= $_;
}
}
-----------------------------------------------------
1行に2つ以上のアンカータグがあった場合を考えてwhileを使用しておりますが、その部分の正規表現に問題が
あるというところまでわかっていながら、全く前進せぬまま日が変わってしまいました。情けないです。
ここの正規表現の区切りとなるものが曖昧なことから、うまく認識してくれず、整形後のHTMLファイルがおかしく
なってしまっているのだと思われます。
もし宜しければ、教えてください。
すみませんが宜しくお願いいたします。
0544nobodyさん
03/06/11 19:24ID:???$reg "s?https?:\/\/[-_.!~*'()a-zA-Z0-9;\/?:\@&=+\$,%#]";
while ( $txt =~ /$reg/g ) {
.
.
.
}
0545nobodyさん
03/06/11 20:35ID:???貴重なヒント感謝です。
しかし、厨房な私にはどうも理解できていないみたいです。
せっかくのヒントをいただきながら、本当に申し訳ありません。
0547nobodyさん
03/06/13 23:26ID:sIi8OqiB↑このような正規表現の場合、これは
頭が"$"or"%"or"@"のいずれかから始まって
続いて、アルファベット以外が来る場合。だと思うのですが?
最後の*?はどういう意味でしょうか?
*は0字以上、?は0か1だと覚えているのですが・・・
0548547
03/06/13 23:27ID:???強調表示するためのものです(perl版)。
0549nobodyさん
03/06/13 23:32ID:???0550nobodyさん
03/06/14 00:26ID:???0551547
03/06/14 00:29ID:???.*hogeに対して
.*?hoge
は、検索対象に対してhogeがヒットした一番最初の部分を
取るという事ですね!
例えば
hogeXXhogeXXhoge
の場合後者は最初のhogeでマッチ。前者は
3つめのhogeでマッチ!
という事ですね!?
0552547
03/06/14 00:32ID:???そ、そうなんですか!?
http://hidemaru.xaxon.co.jp/lib/hilight/perl_php.html
この作者のミスという事でしたか・・・。
しかし勉強になりましたです。
ありがとうございました。
0553nobodyさん
03/06/15 21:39ID:mUOjbxbY<!-- $aaa --> <!-- $bbb -->
と記入されていて、cgi本体で
$aaa = 'aaaの中身';
$bbb = 'bbbの中身';
と定義されている時
test.datをopenし
while(<FH>){
正規表現で$aaaなどの頭に$がついてるのを定義されている変数と置き換える
}
とするにはどうすれば良いでしょうか?
0554nobodyさん
03/06/15 22:16ID:???とりあえず、下のスクリプトで動くには動きますが。。。
$aaa = "あ";
$bbb = "い";
$ret = "\$aaa\$bbbb";
$Hash{'\$aaa'} = $aaa;
$Hash{'\$bbb'} = $bbb;
while(($key,$value)=each %Hash){
$ret =~ s/$key/$value/;
}
print "$ret\n";
#実行すると「あいb」と表示される。
0556553
03/06/15 23:18ID:/un8khu+おぉ〜どうもありがとう。
参考にさせてもらいます。
>>555
出し惜しみせずに書いたつもりでしたが・・・シンプルに書き直します↓
$bbb = 111;
$ccc = 222;
$aaa = 'XXX $bbb XXX $ccc XXX';
print なにか
出力結果
XXX 111 XXX $ccc XXX
というのをやりたいです。また$aaa に含まれる変数名 例$bbbなど
は1つだったり3つだったりとするので一般化したいです。
0558nobodyさん
03/06/15 23:32ID:???#!/usr/local/bin/perl
my $text = 'XXX $bbb XXX $ccc XXX $ddd XXX';
my $dictionary = {
"bbb" => "111",
"ccc" => "222",
};
sub replace_string {
my $dictionary = shift;
my $text = shift;
# $text =~ s/(\$(\w+))/$dictionary->{$2}?$dictionary->{$2}:$1/ge;
$text =~ s/(\$(\w+))/$dictionary->{$2}/ge;
return $text;
}
printf "[%s]\n", $text;
printf "[%s]\n", replace_string($dictionary, $text);
0562nobodyさん
03/06/16 03:58ID:???0564nobodyさん
03/06/16 07:28ID:???マタ〜リしすぎだしこのスレ
0565nobodyさん
03/06/19 09:48ID:zhmAwMLg今現在、<a name="1000</a>になってるソースを
<a name="1000">1000</a>に変更したいのですが
どうすればいいんでしょうか?
ちなみに「1000」の部分は「1」から「1000」までの連番で
<a name="1">1</a>
から
<a name="1000">1000</a>
のようにしたいんです。
ヘンテコな説明ですみません。
0566nobodyさん
03/06/19 10:26ID:???perlの場合はこんな感じかな。(変換前のHTMLが間違ってるけどそれでOKという前提で)
s/(<a name=")(\d+)(<\/a>)/$1$2">$2$3/;
0567nobodyさん
03/06/19 10:51ID:???http://www.2ch.net/
http://www2.2ch.net/
上のすべてに対応するためにはどのように書いたらいいのでしょう?
http://(www\.|www2\.)?2ch\.net/
???
0568nobodyさん
03/06/19 10:56ID:bERWsbmj0572565
03/06/19 21:37ID:???レス遅れてすみません凹
早速、やってみたんですが
思ったように出来ませんでした(>_<)
それと申し遅れましたが、自分
「speeeeeed」というソフト使ってるんですが
このソフトで正規表現を使った置き換えが
出来たらうれしいんです。
わがまま言ってすみません。。
0573nobodyさん
03/06/19 21:45ID:???BREGEXP.DLL導入すれば正規表現使えるって書いてあるから導入すればいいんじゃないのん?
やりかたはHELPに書いてあった。
0574565
03/06/19 21:58ID:???すいません「e」が一個多かったですね^^;
はい、BREGEXP.DLLは導入済みなんですが
正規表現の構文?がわからないので・・・(涙
0576nobodyさん
03/06/19 23:04ID:???■ このスレッドは過去ログ倉庫に格納されています