正規表現道場@2ch Part2
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
02/11/24 22:57ID:LrbVcl3Yこのスレは有用そうな正規表現を紹介したり、どう表現したらいいかわからないときに
質問をしたりするためのスレッドです。
質問するときは使用言語や得たい結果をなるべく詳しく書きましょう。
リンクなどは>>2-5のあたりに。
0084nobodyさん
02/12/10 16:45ID:???0085Name_Not_Found
02/12/10 17:02ID:???それよか、IRIなんてのがひかえてますよ。
008666
02/12/10 22:19ID:???ありがとうございます。1バイト目の文字は
\x81-\x9F\xE0-\xFC
ですが、その通りにしてもなぜか>が消えてしまうようです???
例えば<BR>の次に[が来ていると、
<br? こうなってしまいます。
もしかして、s/(?:^|[^1byte目の範囲を書いてね])\[/?/g;
この場合、Shift_JISの1バイト目の文字以外が来たら、
その文字と[を?の文字に変換してしまうのではないでしょうか?
見当違いならすみません・・・
0087nobodyさん
02/12/10 22:27ID:???これだと、上手くいったような気がします。
>>67さん、ありがとうございました!
008866
02/12/10 22:29ID:???0089nobodyさん
02/12/10 23:02ID:???$hogeが'bookmark'だとちゃんと弾くけどcacheが入ってる場合に弾いてくれない。
http://www.din.or.jp/~ohzaki/regex.htm#Without
ここのやつの意味を勘違いしてるのかなぁ。
0090nobodyさん
02/12/10 23:22ID:???0092Name_Not_Found
02/12/11 01:43ID:61zg/eqGああああ、ごめんなさい。
たしかに、1byte目が消えちゃいますね。
()で$1に保存するか、look-behind 正規表現を使えばいいのかな。
(?=...)の look-ahead はそういうケースでは駄目なはず。
$1 の方は、
s/(^|[^範囲])\]/$1[/g
でいいはず。
look-behind は
s/(?<![範囲])\]/$1'amp;#91;/g
かな。こっちは Perl のバージョンが古いと使えない。5.6 あたりなら大丈夫。
0094
02/12/11 17:44ID:YVHUV6QH>>94という具合に
ページ内にリンク先がある場合に限ってリンクを張りたいのですが
どうしたらいいでしょうか。
【悪い例】
$foo=">>1 hogehoge\n>>2 hogehoge\n"; #置換対象文字列
$num="94"; #最新レスの番号
$max="100" ; #1ページあたりの表示件数
if(($num>$2)&&($2>$num-$max)){
$foo =~ s/(>>)([1-9][0-9]*)/<a href="#$2">$1$2<\/a>/g;
}
置換以前の$2では当然うまくいきませんです。
しかも、置換対象が2つ以上ある場合はどうしたらいいのでしょうか。
009594
02/12/11 17:49ID:YVHUV6QHでございます。
0096Name_Not_Found
02/12/11 18:06ID:7uJNDqfwmy $max =100; # これは range で
my $num =94; # こっちが max の方がいいような気もするけど。
my $foo=<<EOB;
>>1 hogehoge
>>2 hogehoge
EOB
my ( $high, $low ) =( $num, $num - $max );
$foo =~s/(?:>>)(\d+)/
$low <= $value and $value <= $high ? qq(<a href="#$1">>>$1</a>)
: qq(>>$1) /sge;
009796
02/12/11 18:08ID:???$value ってなんじゃ…
$1 ね。
009894
02/12/11 18:11ID:YVHUV6QH009994
02/12/11 18:49ID:YVHUV6QH恐れながら、$1は、>>にマッチするのではないですか?
すみません教えてください。
010096
02/12/11 20:29ID:7uJNDqfw(?:..) は $1..9 に値を保存しません。
なので $1 で問題ないです。
動かなかった理由は / がクォートされてなかったのと
置換文字列を一行に纒めなてかったからのようでした。
なので、s/// の替りに s{}{} を使っときます。
my $max =100; # これは range で
my $num =94; # こっちが max の方がいいような気もするけど。
my $foo=<<EOB;
>>1 hogehoge
>>2 hogehoge
EOB
my ( $high, $low ) =( $num, $num - $max );
$foo =~s{(?:>>)(\d+)}{
$low <= $1 and $1 <= $high ? qq(<a href="#$1">>>$1</a>)
: qq(>>$1) }sge;
010196
02/12/11 20:31ID:7uJNDqfw意味無いんで外しといてください。
010294
02/12/12 00:14ID:pDUwoT6Y0103nobodyさん
02/12/24 22:43ID:???0104名無しさん
03/01/03 00:29ID:yu7P73hS最短マッチが、いろいろ読んだけどわかりません。phpです。
/* hoge */ hogehoge /* hoge */ の /* */
で囲んだ部分だけ灰色にしたいんです。
ereg_replace("(/\*.+\*/)","<font color=\"gray\">\\1</font>");
こうすると 最初と最後の/* */にマッチしてしまいます。
たぶん、最長マッチだからです。
最短マッチにするには?をつけろと書いてあるけど、どこにつけるかわかりません。
(/\*.+\*/){1,}? こうするとなにも出てきません。
なんか基本的なことがわかってないです。
0105nobodyさん
03/01/03 00:46ID:nupLg+Ov0106104
03/01/03 01:09ID:yu7P73hS0107104
03/01/03 01:23ID:yu7P73hS教えてください・・・
0108nobodyさん
03/01/03 01:27ID:nupLg+Ovもしかしたらereg()で最短一致は使えないのかも。
preg_replaceでなら上手くいくかも。
0109104
03/01/03 01:40ID:yu7P73hSでもpregでもできません・・(;_;)
というか、なにも表示されないというのがアヤシイです。。
0110nobodyさん
03/01/03 01:41ID:???0111nobodyさん
03/01/03 17:38ID:???このように書いてもソが脳内通りに取得出来ないんですが
どうすればいいんでしょうか?
0112nobodyさん
03/01/03 21:33ID:nupLg+Ov0114山崎渉
03/01/15 13:36ID:???0115nobodyさん
03/01/18 13:42ID:???URLの抽出前に<>"を文字参照に置き換えると、
URLの抽出を行うと、http://www.yahoo.co.jp">Yahoo</a>
とかもa>までURL扱いになってしまい、困っています。
$msg=~s/(http|ftp|mailto)\:([\w.\@~\/\-\?&=;%#]+)/\<a href=\"$1:$2\">$1:$2<\/a>/g;
URL抽出部分はこんな感じです。
0116nobodyさん
03/01/18 13:45ID:hA2YqZMs0118115
03/01/18 18:54ID:???>じゃあ、抽出後に<>を置き換える。
抽出後に<>を置き換えると、
<aまで<aに置き換わってしまうので・・・
>まとめて括弧でくくれば
そうですね。
で、一旦[link]http://www.yahoo.co.jp[/link]に置き換えてから、
<>を置き換えて、[link]...[/link]を置き換えるというもの考えたんですが、
それだと
=~/\[link\](.*)\[\/link\]/\<a href=\"$1\">$1\<\/a\>/g;
等としても、最初の[link]から最後の[/link]までが置き換わってしまって、
2つlinkが続く場合等に予期しない結果になってしまいます。
0120115
03/01/18 19:23ID:hA2YqZMs表示時にタグ付けすると解決する?
0122115
03/01/18 19:33ID:???<a href="http://www.yahoo.co.jp/&quot;>Yahoo</>
とかになるわけで・・・
0123nobodyさん
03/01/18 19:38ID:???なんでやねん。
データ:
http://www.2ch.netって死ぬほどおもしれー!
表示:
<a href="http://www.2ch.net">http://www.2ch.net</a>って死ぬほどおもしれー!
0124115
03/01/18 19:47ID:???<a href="http://www.yahoo.co.jp/">Yahoo!</a>
と投稿した場合。
char str[]="http://www.yahoo.co.jp/";
等でも同じ。(この場合はco.jpの後の"もリンク扱いされてしまう)
0127nobodyさん
03/01/20 08:07ID:vz/F/uwh一番エレガントな書き方ってどういうのですか?あと
$url = 'http://www.2ch.net/';
$url =~ s/2ch/1ch/;
と書いた場合になんで$url のなかの"/"をエスケープしなくても
エラーにならないんでしょうか?
0129nobodyさん
03/01/20 08:09ID:???http\/\/:(www\.)?2ch\.net\/
0131nobodyさん
03/01/20 19:22ID:gSzazTgePerlだと、こう書く。
m#^http//:(?:www\.)?2ch\.net/$#
完全一致だよね。知らないけど。
あと、DNSは大文字小文字を区別しないから、この書き方は間違ってる。
今の場合は、単に正規表現を聞いてるんだから、/をエスケープする必要は無いし、
それに、Perlで使うときも、いちいち/をエスケープするのは、エレガントじゃない。
0132nobodyさん
03/01/20 20:43ID:vz/F/uwhでも、なんで
s/http://www\.2ch\.net/http://www\.1ch\.net/;
がエラーで
$url = 'http://www\.2ch\.net/';
$b = 'http://www\.1ch\.net/';
$url =~ s/$url/$b/;
がokなんでしょうか?
そのへんの理屈がよく分かりません
0133nobodyさん
03/01/20 21:52ID:gSzazTgeから、インタプリタはs/ / /を認識できる。
0134nobodyさん
03/01/20 22:08ID:???s///による置換を行う前に、s///の構文チェックをしているからでしょう多分きっと。
s/http://www\.2ch\.net/http://www\.1ch\.net/;
sの次に/があるので/を区切りとした構文としてチェックしてみる。
3つ目の/以降はスイッチ部。
wwwというスイッチは存在しないので、エラー出力
(Bareword found where operator expected, near "s/http://www")
s/$url/$b/;
構文としてはs///という形になるのでOKなので、
次に、正規表現の文字列となる$urlを正規表現のスタック?に展開して積み込み、
同じく$bを展開部用のスタックに積み込んでいるのではなかろうか。
あくまでも想像。
0135nobodyさん
03/01/22 11:39ID:Lm4zDQtU/(^.*key.*$)/$1/
じゃダメポ。
というのも、とあるテキスト書換えソフトでgrep出来たらいいなと。
0137nobodyさん
03/01/22 11:44ID:???foreach(@hoge)
{
if(/^.*key.*$/)
{
push(@a,$_);
}
}
で、良いじゃん。正規表現が合ってるかはは知らんけれど
0138nobodyさん
03/01/22 12:04ID:Lm4zDQtUgrepが使えたらこんな事はしないかと。
>>137
if等は使えないんですよ。
つまりエディタの検索、置換えに指定する事でgrepするようなものです。
0140nobodyさん
03/01/22 14:10ID:Lm4zDQtU例えですけど、メモ帳の置換えでif使えますか?
マクロじゃないですので使えないです。
0144nobodyさん
03/01/22 15:59ID:???0145nobodyさん
03/01/22 16:47ID:Lm4zDQtU何か大きく勘違いなされてるようで。
とにかく、1行(s/find/rep/)の構文だけでgrepと同じ事を出来ないかと言う事です。
スクリプトを組めるなら最初からそうしますが
制約上そのような事ができません。
0147nobodyさん
03/01/22 17:30ID:Lm4zDQtUどういう事でしょうか?
0148nobodyさん
03/01/22 17:36ID:???はじめから落ち着いて、
・一体どんなアプリケーションを作っているのか。
・一体そのアプリケーションのどの処理で悩んでいるのか。
・ifが使えない制限とは?
位は書いてくれい。
0149nobodyさん
03/01/22 17:56ID:Lm4zDQtU・使ってるソフト。
よくあるファイル一括書換えソフト。
・やりたい事
メモ帳の置換え(CTRL+H)のような感じで
検索する文字と置換えする文字を指定する事で
ファイルの内容を一気に高速で書き換えられる。
検索文字列及び置換え文字列はBREGEXP.DLLを使う事で
Perlと同等の置換えが指定できる。
その検索文字列と置換え文字列の指定方法。
・IFが使えない理由。
メモ帳のように検索文字と置換え文字を指定する事しか出来ない為。
ソフトを作ってる訳ではなく使っているだけ。
です。以上で分かって頂けるでしょうか?
0151nobodyさん
03/01/22 18:06ID:Lm4zDQtU何故無理と言い切れるのでしょうか?
0152nobodyさん
03/01/22 18:18ID:???0153nobodyさん
03/01/22 22:05ID:NkPjRdCp正規表現は、置換にも使えると聞き、検索っていうとこで、正規表現をオンにして、
自慢のコードをつっこんでみたが、ちゃんと動かないので、調べるのは面倒だから、
2chに書き込んでみた。でどうだ。
で、さらに、正規表現∈Perlだと思っている。と。
キボンヌって言えば仲間になるから大丈夫だと思っていたら大間違いだぞ。
0158nobodyさん
03/01/28 00:31ID:2+2ZA9Prif($ENV{'REMOTE_HOST'}=~/crawl[\d]+\.googlebot\.com/){⊥}
でいいのけ?
0159nobodyさん
03/01/28 00:52ID:???$robots = "crawl4.googlebot.com";
if($robots =~ /crawl[\d]+\.googlebot\.com/ ){ print "kita----!!";}
をローカル環境でテストしてみる。
0160nobodyさん
03/01/28 16:58ID:Go6r3Mozそれから、後方一致で調べればいい。
↓普通はこう。googlebotドメインだったらいいんでしょ?
$ENV{REMOTE_HOST} =~ /\.googlebot\.com$/i
↓\dを使うなら、こう使う。\d = [0-9]なので
$ENV{REMOTE_HOST} =~ /crawl\d+\.googlebot\.com$/i
0161nobodyさん
03/01/29 11:03ID:aizQjUQ4$salt =~ s/[^\.-z]/\./go;
の [^\.-z] これって、具体的にはどれを表すんですか?
0162nobodyさん
03/01/29 13:00ID:w0j+LU9j./0123456789:;<=>?@
ABCDEFGHIJKLMNOPQRSTUVWXYZ
abcdefghijklmnopqrstuvwxyz
↑以外
0165nobodyさん
03/01/29 21:40ID:aizQjUQ4ありがとん。
0166nobodyさん
03/01/29 21:45ID:Jsuq0iRwで、$word に「エロ」を入れてやると、「トロ」という言葉にもマッチするんですが、
何故でしょうか?
0167nobodyさん
03/01/29 22:08ID:???最後の i のせい。
「エ」の2バイト目は "G"
「ト」の2バイト目は "g"
i をつけると大文字小文字を区別しなくなるので、この2つがマッチする。。
0168nobodyさん
03/01/29 22:11ID:???http://www.din.or.jp/~ohzaki/perl.htm#JP_Match
ここを読んでおけ
0169nobodyさん
03/01/29 23:18ID:???( ´_ゝ`)フーン
能無し君がまだ初心者相手に威張る為ここに居たんですか。
まぁ分からない事聞かれて逆切れしてるような貴方にはここがお似合いですね。
( ´,_ゝ`)プッ
0171質問者
03/02/02 12:33ID:aPQL5QO2一回の検索で、マッチした文字列がどの条件にあたるかを知ることが出来る?
たとえば
対象文字列: abcdefg
検索語彙: (ab)|(fg)
こういうとき、"ab"と"fg"がマッチするということはわかるが
マッチした文字列がそれぞれどの条件だったのかを知りたい。
BREGEXP(Perl5)もしくはVBRegularExpressionで。
一回の検索では無理?
0173質問者
03/02/02 12:39ID:aPQL5QO2実はプログラム技術板から来た。
正規表現スレがあるのはこの板だけっぽい。
マッチ文字列を取得することは可能なのだが、
何にマッチしたのかを確かめるためにはどうすれば‥‥?
0174nobodyさん
03/02/02 12:42ID:???つぅか誘導したのはこの俺だ。
マッチさせたい文字列は自明(自分で設定したんだからな)なのだから後はifとeqで比較すればどうだ?
0175質問者
03/02/02 17:45ID:aPQL5QO2そか、どうも。
マッチした文字列を検索文字列と比較するということ?
>>171で書いた例についていえばそのとおりだが
正規表現でマッチさせたものについて知りたいので
単純にifで比較してもしょーがない。
(検索文字列が"a."などのとき、比較してもしょうがない)
かといって正規表現でテストするってのも二度手間だし。
正規表現でうまく書けば出来るとか、
普通そーゆー機能あるよ、とかいうことはないですかー?
0176nobodyさん
03/02/02 17:47ID:???$x =~ /(ab)|(cd)/;
if($1 eq "ab")
{
print("ab");
}
0177nobodyさん
03/02/02 17:56ID:???なるべく別々に処理を行うようにするけど。
VBとかの機能はマ板で訊いてください。
0179質問者
03/02/02 18:20ID:???ありがと。
もしかして知らないところで世の中便利になってて
一撃で出来るかなーと思ったのですが。
とりあえずあきらめときます。
0182nobodyさん
03/02/14 01:16ID:???■ このスレッドは過去ログ倉庫に格納されています