1 :
nobodyさん :
02/11/24 22:57 ID:LrbVcl3Y Perlに限らずスクリプト系言語で大活躍の正規表現。
このスレは有用そうな正規表現を紹介したり、どう表現したらいいかわからないときに
質問をしたりするためのスレッドです。
質問するときは使用言語や得たい結果をなるべく詳しく書きましょう。
リンクなどは
>>2-5 のあたりに。
4 :
nobodyさん :02/11/25 00:15 ID:oyWFxt5H
パターン集みたいなのは無いですか? コード書く度に思い出すはめんどい。ていうか忘れてる。
あぼーん
6 :
Name_Not_Found :02/11/29 22:13 ID:/ULd/3Z0
age
7 :
nobodyさん :02/12/05 05:07 ID:5X+JpwfG
perlのcgiですけど、正規表現の置換でこれを含む語は置換したくないっていう時は どうやるんでしょうか? 例えばテキスト中の「パーマン」は全部「プーヤン」に置換したいんだけど、 「パーマン3号」だけはスルーする、という風にするには。 一度全部「プーヤン」に変換してから「プーヤン3号」から「3号」を取る、 という方法しかないんでしょうか?お願いします。
>>7 こうかな。
$str =~ s/パーマン(?!3号)/プーヤン/g;
9 :
nobodyさん :02/12/05 06:15 ID:5X+JpwfG
ありがとうございます、でも駄目でした、、、(;´Д`) やりたいことは掲示板にurlを書くと自動リンクになるようにしたいんですけど、 後で修正しようとすると先ほど自動で貼ったアンカータグの中のurlも、 そのアンカータグで囲まれたurlにも再度アンカータグを貼ってしまいます。 (?!3号)みたいにして括弧で囲んで?!を付ければ無視されるのかなと思い、 $comment =~ s/(?!<a href=\")(https?|ftp|gopher|telnet|whois|news)\:([\w|\:\!\#\$\%\=\&\-\^\`\\\|\@\~\[\{\]\}\;\+\*\,\.\?\/]+)(?!<\/a>)/<a href=\"$1\:$2\" target=\"_blank\">$1\:$2<\/a>/ig; としてみたのですが無理でした。 説明不足ですいません。
修正するときって普通元データを弄るんじゃないのかね?
11 :
nobodyさん :02/12/05 07:02 ID:5X+JpwfG
そうです、元データをテキストエリアに読み込んでくるんです。 それを修正します。
>>10 すいません、質問の意味がわかりました。
cgiで表示させるだけなら、その時にだけ自動リンクを使えばいいですよね、
でも一日ずつhtmlファイルで保存してそれを読み込んでくるタイプなので、
元ファイルにすでにアンカーが貼られてるんですよ。
だからそれを修正しなければならない、とこういうわけです。
掲示板というよりニュースサイトのようなものを作ってます。
13 :
12 :02/12/05 07:47 ID:???
間違った。 × アンカー ○ <a href=""></a>
14 :
Name_Not_Found :02/12/05 08:16 ID:0NYAnUxi
15 :
12 :02/12/05 10:00 ID:5X+JpwfG
16 :
12 :02/12/05 10:05 ID:???
あれ?何か二日目に余計な&lt;/a&gt;っていうのがついちゃった。
s/(?<![">])(https?|ftp|gopher|telnet|whois|news)\:([\w|\:\!\#\$\%\=\&\-\^\`\\\|\@\~\[\{\]\}\;\+\*\,\.\?\/]+)(?!["<])/<a href=\"$1\:$2\" target=\"_blank\">$1\:$2<\/a>/ig;
18 :
Name_Not_Found :02/12/05 10:45 ID:0NYAnUxi
>>15 それはもう処理の内容を考え直した方がいいと思われ。
基本的に追加なんだろうし。
html をこんな風にして、
<!-- news here -->
これすごい <a href="...">...</a>
で、追加分を html に変換後、
出力ファイルの <!-- news here --> をサーチして追加分をそこに足す、
みたいなやりかたはどう?
過去記事も頻繁に修正する可能性があるなら元データを残すやり方にするべき。
もっとも、リクエスト毎に html に変換するんではなく、
スタティックな html をあらかじめ作っておくってやり方はそのままでいいと思う。
実際、複雑すぎる正規表現は速度とメンテナンス性を低下させるし。
>17 それじゃ<br>が入ってる場合は最初の行しか置換されないし、 その最初の行も最後の一文字が無視される罠。
21 :
12 :02/12/05 19:13 ID:5X+JpwfG
すいません、遅れました。 今17さんのでやってみたのですが、確かに20さんがおっしゃるような結果が出てしまいました。 あと、メールアドレスが置換されないみたいです。 >15 まさにそのやり方です、<!-- news here -->のようなコメントをサーチする。 ただ、僕は修正がすごく多いです、、、。 元データを残すやり方は、人様のスクリプトを改良してるので 一からやり直しになるし、またバージョンアップ版が出た時の互換性とか考えると ツライですねぇ。 もちろん、著作権表示と改造表示は出してます。
22 :
12 :02/12/05 19:37 ID:???
失礼、>15ではなくて>18でした
23 :
nobodyさん :02/12/06 00:05 ID:0LEQc9+/
>>12 とりあえず10分ほどやってみたが出来なかった、
ウチの上司なら出来ると思うが昨日から出張‥‥
未だに意味がわからねぇw 一旦アンカータグ消せばいいんジャネーノ?的外れ?
2chだせぇ
27 :
Name_Not_Found :02/12/06 03:26 ID:N6C9SdnH
じゃあ、こうするのは? 追加と修正は別フェイズにするの。 修正時は余計な変換処理無しで html を直接弄って、 追加の時は追加分だけ変換処理して <!-- news here --> につっこむの。 ただ、直接 html 弄れるフォームがあるってのは 心理的に好きじゃないなぁ。 なんだか正規表現と関係なくなってきたなぁ…
すいません、もともと正規表現についてはよくわからなかったので、とりあえず 「変数$newsの中から、アンカータグの中のものと、アンカータグに囲まれた部分は 無視してそれ以外を置換する」 ということがサクっと簡単に出来るものだと思ってました。 長く引っ張ってしまって申し訳ないです、正規表現、一から出直して勉強してきます。
$msg =~s{<a href="<a href=".*?">(.*?)</a>">}{<a href="$1">}g; $msg =~s{<a href=".*?"><a href=".*?">(.*?)</a></a>}{<a href="$1">$1</a>}g;
>>29 そういう処理しなきゃいけない状況が不毛なんだってば。
33 :
Name_Not_Found :02/12/07 04:46 ID:705rdiGC
>>32 おばかなプログラムが増えていく状況を助長してはいけません。
「ライトついてますか?」でも読んでくれ。
オリジナルタグみたいなモノを使えるようにしているのですが <code></code>で囲んだ間は、オリジナルタグを無効になるように処理したいです。 でも、<code>〜</code>〜</code>こういう風に書かれたら 途中で終わってしまて困ってます。 どうしたら良いでしょうか?
>>36 オリジナルタグってなに?
無効にするってどうすることを無効とするの?
38 :
36 :02/12/08 13:40 ID:???
すみません、説明不足でした。 簡単に言うと、 <code>〜</code>hogehoge</code> これを <blockquote>〜</code>hogehoge</blockquote> こうやって置き換えをしたいのですが、 <blockquote>〜</blockquote>hogehoge</code> になってしまいます。 s/<code>(.*?)<\/code>/i; $t =$1; $t =~ /</</i; $t =~ />/>/i; s/<code>(.*?)<\/code>/<blockquote>$t</blockquote>/i; ソースはこんな感じです。どうしたらいいでしょう…
>>36 >こういう風に書かれたら
っていうことはユーザーの入力を処理するってこと?
それならまずタグの閉じ忘れチェックをすればいいんじゃないかな。
40 :
37 :02/12/08 15:01 ID:???
@conv{qw(< >)}= ('<', '>'); s#<code>(.*)</code>#'<blockquote>'.(($_=$1)=~s/(<|>)/$conv{$1}/g,$_).'</blockquote>'#e;
41 :
37 :02/12/08 15:03 ID:???
しっ、失敗・・・ りとらい @conv{qw(< >)}= ('<', '>'); s#<code>(.*)</code>#'<blockquote>'.(($_=$1)=~s/(<|>)/$conv{$1}/g,$_).'</blockquote>'#e;
$t = '<code>〜</code>hogehoge</code>'; $t =~ s/<code>(.*)<\/code>/<blockquote>$1<\/blockquote>/i; print $t ; これでどうよ?
あ、<と>も置換するのね。 その辺は適当に読み直してくれといいつつ書いてみる。。 $t = '<code>〜</code>hogehoge</code>'; $t =~ /</</i; $t =~ />/>/i; $t =~ s/<code>(.*)<\/code>/<blockquote>$1<\/blockquote>/i; print $t ; 間違ってたらごめんよ。
$t = '<code>〜</code>hogehoge</code>'; $t =~ /</</g; $t =~ />/>/g; $t =~ s/<code>(.*)<\/code>/<blockquote>$1<\/blockquote>/i; 痛いな、漏れ。
45 :
Name_Not_Found :02/12/08 17:44 ID:cySwFV0O
<code>あああ</code>ほげ<code>ほげ</code>ふがふが</code> とかの場合、どこからどこまでが blockquote? どういうシチュエーションなのかよくわからんちん。 textarea に書き込まれた文字を処理するのか テンプレートファイルでの処理用のタグを導入してるのか…
>>45 なにも考えずに正規表現を書き、
足りない部分は脳内補完、
がこのスレの主旨・・・なのか?
47 :
Name_Not_Found :02/12/08 18:00 ID:cySwFV0O
なんか、ここ最近の流れみてるとそうらしいですね。 指摘すると切れるし。
単に質問の仕方が悪いだけだろうよ。
49 :
Name_Not_Found :02/12/09 06:04 ID:7ZfXL1H9
まあ脊髄反射で答えるのは双方のためにならんってこった。
50 :
nobodyさん :02/12/09 11:29 ID:N8zphpYN
整数と小数を許可する正規表現を書きたいと思って ↓を書いてみました。 ^[0-9]*\.{1}[0-9]$ でも、これだと必ず小数点を書かないといけません…。 例えば「12」という数値を通したい場合 「12.0」にしないとエラーになってしまうのです。 「12」でも通るようにするためにはどう書けば良いのでしょうか。
^-?\d+(?:\.\d+)?$ .1 の形式を許可するなら ^-?\d+(?:\.\d+)?|\.\d+$
52 :
50 :02/12/09 12:07 ID:???
負数も許可したくなかったので ^\d+(?:\.\d+)?$ とすると希望の動作しました!ありがとうございます。
53 :
50 :02/12/09 12:31 ID:N8zphpYN
先ほど教えていただいた ^\d+(?:\.\d+)?$ これを丸々否定したいのですが、 ^[^\d+(?:\.\d+)?]$ だとダメでした。 どのようにすれば良いでしょうか…。何度もスイマセン。 何がやりたいかというと、とあるcgiでの入力チェックを行う際に 「有効書式設定」「無効書式設定」というのがあります。 そこにフォームからの入力チェックを正規表現で設定できるのですが、 「有効書式設定」に先ほどの正規表現を入力すると 必ず入力しなくてはならなくなりました。 ですので「無効書式設定」に先ほどの正規表現を 丸々否定したものをすれば、必ず入力しなくても良くなるのでは と思って質問させていただいてます。
>>53 !~ /^\d+(?:\.\d+)?$ /
55 :
50 :02/12/09 17:05 ID:N8zphpYN
>>54 許可したくないものまで許可できてしまいました…。
ですので、「整数と小数、または、0文字を許可」という条件を
「有効書式設定」の所に設定し直そうと思います。
整数と小数の部分は
^\d+(?:\.\d+)?$
でいけてるのですが「または、0文字を許可」の部分を
↑にどのように付け加えればよいのかわかりません。。
すいませんがよろしくお願いします。
56 :
Name_Not_Found :02/12/09 17:29 ID:Pf18ytiH
>>55 0文字を許可を入れる場合の定石は、
処理ループの(ループだよね?)最初で /^$/ 等でマッチさせる。
一つの正規表現でやるよか速くなる可能性高いからそっちも考えて。
"または" がきたら、普通に if とかの使用も考えること。
57 :
55 :02/12/09 17:40 ID:N8zphpYN
>>56 今回、cgiそのものを書いているのではなく
cgiを設定する画面が存在して、その「有効書式設定」部分に
正規表現を書けば、自動的に入力チェックを行ってくれるというものです。
┌―――――――┐
有効書式設定:| |
└―――――――┘
cgiのこのテキストボックスに書くって感じです。
なので、一つの正規表現で解決させたいです。。
>>57 なるほど。でしたら、
^(?:\d+(?:\.\d+)?)?$
で。
.0123 とかを許可するんだったら
^(?:\d+)?(?:\.\d+)?$
で。
59 :
57 :02/12/09 18:19 ID:???
>>58 ありがとうございます!!!
これでばっちりです!
本当に助かりました…。
60 :
36 :02/12/09 18:50 ID:???
遅くなってスミマセン。
>>37 ,42,45
ありがとうございました、無事変換できました。
つまり、?が要らなかったんですね。
<code>あああ</code>ほげ<code>ほげ</code>ふがふが</code>
つまり、最初と最後の<code></code>のみを変換して、
間に入っているタグは無効にしたかったんです。
かなり悩んでいたので、助かりました。感謝です!
ところで、37さんのと44さんのではどちらが効率が良いのでしょうか?
perlの正規表現で
http:// 〜を<a href〜>つけてリンクにするのは
どんな表現方法が一番いいのでしょうか?
63 :
nobodyさん :02/12/10 06:27 ID:QO7zNhpw
すいません、複数の語句に対してマッチするかどうかしらべてるんですけど 何に対してマッチしたかがわかりません。 例えば if($ref=~ /ああ/ || $ref=~ /いい/ || $ref=~ /うう/ || $ref=~ /ええ/){ $ref=さっきマッチした語句 , "おお"; } みたいな処理をする場合、さっきマッチした語句を調べるにはどうしたらいいのでしょうか? $_ とか$1を当てはめても上手くいかないんですが。 お願いします。
64 :
63 :02/12/10 06:34 ID:???
$&ですね、逝ってきます‥‥
「format2ちゃんねる&hc=0&hs=0」 みたいなフォーマットの文を この例では「2ちゃんねる」に当たる部分だけ抜き出したいので $text=2ちゃんねる&hc=0&hs=0; $text =~ /format(.*)\&(.*)/: $hensu=$1; みたいに書くと、$hensuの中身が 「2ちゃんねる&hc=0」という風に 一番最後にある「&」で区切られてしまいます。 最初に出くわした「&」で区切りたい、という時にはどうしたらいいんでしょうか?
置き換えに関して質問なのですが [→[ ]→] と言う風に置き換えをしたいのですが、下記のようにすると $msg =~ s/\Q[\E/?/g; $msg =~ s/\Q]\E/?/g; ー の文字コードが81 5Bで、 [ の文字コードが5Bなので ー が文字化けをしてしまいます。 文字コードはShift_JISです。どういう風にすれば文字化けを回避できるでしょうか?
67 :
Name_Not_Found :02/12/10 10:17 ID:SHy7dsCG
>>65 .* とか .+ は最も長くマッチしようとします。
.*& ってやると後ろの & まで見ちゃうわけですね。
そういう場合は .*? みたいに、後ろに ? を付けると
なるべく短かくマッチしようとするようになります。
>>66 前の文字が Shift JIS の 1byte目じゃなければ置換、ってすればいいのかな。
s/(?:(?:^|[^1byte目の範囲を書いてね])\[)/?/g;
試してないからわからないけど、これでどうでしょう?
>>67 括弧余計すぎた。
そと側の (?: .. ) はいらないわな…
69 :
65 :02/12/10 10:46 ID:???
70 :
Name_Not_Found :02/12/10 11:42 ID:SHy7dsCG
>>69 ただ、.*? は遅くなることがあるから、
この場合は [^&]*& の方が望ましいです。
http:// 〜〜〜〜 のURLを検出する正規表現で
速いのってどんなやつ?
kentでは
$test =~ s/([^=^\"]|^)(https?\:[\w\.\~\-\/\?\&\=\@\;\#\:\%]+)/$1<a href=\"$2\" target=\"_top\">$2<\/a>/g;
ってやってるみたいだけど これ遅くない?
>>71 ([^=^\"]|^)って何? いらないんじゃ……
>>71 シラソ
kentのやつみたらそうなってた。
多少曖昧でもいいから速いマッチング方法キボン
74 :
72 :02/12/10 12:44 ID:???
最初の部分はすでにA要素がある場合の対策かな。 それを削ってこんな感じ。 $test =~ s/(https?\:\/\/[a-zA-Z\.\~\-\/\?\&\=\@\;\#\:\%_!*'()]+)/<a href=\"$1\">$1<\/a>/g; ちなみに、[]内はURI使える文字だけど、kentのは不足している。 動作確認していないので、フォローよろしく。
75 :
72 :02/12/10 12:59 ID:???
ごめん、0-9抜けてた。\のいらない記号もあると思う。 $test =~ s/(https?\:\/\/[-a-zA-Z0-9.~\/?&=\@;#:%_!*'()+\$,]+)/<a href=\"$1\">$1<\/a>/g;
$test =~ s/(https?\:\/\/[\S]+)/<a href=\"$1\">$1<\/a>/g; ではダメ?
77 :
76 :02/12/10 14:41 ID:???
'<''>'は排除しなきゃか・・・
78 :
76 :02/12/10 14:44 ID:???
$test =~ s/(https?\:\/\/[\S<>"']+)/<a href=\"$1\">$1<\/a>/g; かな?
79 :
76 :02/12/10 14:45 ID:???
$test =~ s/(https?\:\/\/[^\s<>"']+)/<a href=\"$1\">$1<\/a>/g; だ・・・鬱
81 :
76 :02/12/10 15:19 ID:???
>>82 2バイト文字を使うウマシカに付ける薬によいのでは?(w
多国語ドメインがRFCになるとURLの切り出しがウザそう
>>84 それよか、IRIなんてのがひかえてますよ。
86 :
66 :02/12/10 22:19 ID:???
>>67 ありがとうございます。1バイト目の文字は
\x81-\x9F\xE0-\xFC
ですが、その通りにしてもなぜか>が消えてしまうようです???
例えば<BR>の次に[が来ていると、
<br? こうなってしまいます。
もしかして、s/(?:^|[^1byte目の範囲を書いてね])\[/?/g;
この場合、Shift_JISの1バイト目の文字以外が来たら、
その文字と[を?の文字に変換してしまうのではないでしょうか?
見当違いならすみません・・・
s/(?=[\x81-\x9F\xE0-\xFC])\[/[/g;
これだと、上手くいったような気がします。
>>67 さん、ありがとうございました!
88 :
66 :02/12/10 22:29 ID:???
と思ったらエスケープされてませんでした・・・
/^(?:(?!cache).)*$/
92 :
Name_Not_Found :02/12/11 01:43 ID:61zg/eqG
>>86 ああああ、ごめんなさい。
たしかに、1byte目が消えちゃいますね。
()で$1に保存するか、look-behind 正規表現を使えばいいのかな。
(?=...)の look-ahead はそういうケースでは駄目なはず。
$1 の方は、
s/(^|[^範囲])\]/$1[/g
でいいはず。
look-behind は
s/(?<![範囲])\]/$1'amp;#91;/g
かな。こっちは Perl のバージョンが古いと使えない。5.6 あたりなら大丈夫。
93 :
66 :02/12/11 08:02 ID:???
>>92 lookbehindを使えば良かったんですね!
何度もありがとうございました。
94 :
:02/12/11 17:44 ID:YVHUV6QH
質問します。言語はperlです。
>>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つ以上ある場合はどうしたらいいのでしょうか。
95 :
94 :02/12/11 17:49 ID:YVHUV6QH
$foo =~ s/(>>)([1-9][0-9]*)/<a href="#$2">$1$2<\/a>/g; でございます。
96 :
Name_Not_Found :02/12/11 18:06 ID:7uJNDqfw
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 <= $value and $value <= $high ? qq(<a href="#$1">>>$1</a>)
: qq(>>$1) /sge;
97 :
96 :02/12/11 18:08 ID:???
ミスッた。 $value ってなんじゃ… $1 ね。
98 :
94 :02/12/11 18:11 ID:YVHUV6QH
>>96 早速ありがとうございます。やってみます。
99 :
94 :02/12/11 18:49 ID:YVHUV6QH
なぜかうまくいきません。 恐れながら、$1は、>>にマッチするのではないですか? すみません教えてください。
100 :
96 :02/12/11 20:29 ID:7uJNDqfw
>>94 (?:..) は $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;
101 :
96 :02/12/11 20:31 ID:7uJNDqfw
というか (?:...) を使う意味ないじゃんね… 意味無いんで外しといてください。
102 :
94 :02/12/12 00:14 ID:pDUwoT6Y
ありがとうございました。
104 :
名無しさん :03/01/03 00:29 ID:yu7P73hS
すいません 教えてください。。 最短マッチが、いろいろ読んだけどわかりません。phpです。 /* hoge */ hogehoge /* hoge */ の /* */ で囲んだ部分だけ灰色にしたいんです。 ereg_replace("(/\*.+\*/)","<font color=\"gray\">\\1</font>"); こうすると 最初と最後の/* */にマッチしてしまいます。 たぶん、最長マッチだからです。 最短マッチにするには?をつけろと書いてあるけど、どこにつけるかわかりません。 (/\*.+\*/){1,}? こうするとなにも出てきません。 なんか基本的なことがわかってないです。
105 :
nobodyさん :03/01/03 00:46 ID:nupLg+Ov
.*?
106 :
104 :03/01/03 01:09 ID:yu7P73hS
/\*.*?\*/ ということでしょうか? なんもでてこないです(;_;)
107 :
104 :03/01/03 01:23 ID:yu7P73hS
/\*.+?\*/ でもでてこないです。なんか勘違いしてるのでしょうか 教えてください・・・
108 :
nobodyさん :03/01/03 01:27 ID:nupLg+Ov
うぅーそれ以上はわからない・・ もしかしたらereg()で最短一致は使えないのかも。 preg_replaceでなら上手くいくかも。
109 :
104 :03/01/03 01:40 ID:yu7P73hS
ありがとうございます・・ でもpregでもできません・・(;_;) というか、なにも表示されないというのがアヤシイです。。
そんなあなたにPerlをお奨めしますです。。。
$hoge=$1 if($text=~/(ソ+)/); このように書いてもソが脳内通りに取得出来ないんですが どうすればいいんでしょうか?
112 :
nobodyさん :03/01/03 21:33 ID:nupLg+Ov
$hoge=$1 if($text=~/((?:ソ)+)/);
113 :
111 :03/01/04 17:33 ID:???
>>112 無事成功しました。
ありがとうございました。
114 :
山崎渉 :03/01/15 13:36 ID:???
(^^)
掲示板スクリプト作っているんですが、
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抽出部分はこんな感じです。
116 :
nobodyさん :03/01/18 13:45 ID:hA2YqZMs
変な日本語ですみません。頭がボーとしてて・・・
>>115 じゃあ、抽出後に<>を置き換える。
後、$1と$2、どうせ結合するならまとめて括弧でくくればいいのに。
118 :
115 :03/01/18 18:54 ID:???
>>117 >じゃあ、抽出後に<>を置き換える。
抽出後に<>を置き換えると、
<aまで<aに置き換わってしまうので・・・
>まとめて括弧でくくれば
そうですね。
で、一旦[link]
http://www.yahoo.co.jp[/link]に置き換えてから 、
<>を置き換えて、[link]...[/link]を置き換えるというもの考えたんですが、
それだと
=~/\[link\](.*)\[\/link\]/\<a href=\"$1\">$1\<\/a\>/g;
等としても、最初の[link]から最後の[/link]までが置き換わってしまって、
2つlinkが続く場合等に予期しない結果になってしまいます。
>>118 俺ならタグ付けは表示時に行う。データに妙な情報付けたくないんで。
120 :
115 :03/01/18 19:23 ID:hA2YqZMs
122 :
115 :03/01/18 19:33 ID:???
124 :
115 :03/01/18 19:47 ID:???
>>124 <.*?(\"([^\"]+?)\".*?)*..?>
127 :
nobodyさん :03/01/20 08:07 ID:vz/F/uwh
>>127 http\/\/:[www\.]?2ch\.net\/
ごめん。まだ寝てるわ http\/\/:(www\.)?2ch\.net\/
>>127 > エラーにならないんでしょうか?
エラーになったら誰も使わなくなるから(w
131 :
nobodyさん :03/01/20 19:22 ID:gSzazTge
>>127 Perlだと、こう書く。
m#^http//:(?:www\.)?2ch\.net/$#
完全一致だよね。知らないけど。
あと、DNSは大文字小文字を区別しないから、この書き方は間違ってる。
今の場合は、単に正規表現を聞いてるんだから、/をエスケープする必要は無いし、
それに、Perlで使うときも、いちいち/をエスケープするのは、エレガントじゃない。
132 :
nobodyさん :03/01/20 20:43 ID:vz/F/uwh
133 :
nobodyさん :03/01/20 21:52 ID:gSzazTge
構文解析時には、変数は展開されていない。 から、インタプリタはs/ / /を認識できる。
>>132 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を展開部用のスタックに積み込んでいるのではなかろうか。
あくまでも想像。
135 :
nobodyさん :03/01/22 11:39 ID:Lm4zDQtU
perl1行でgrepと同じ事する方法キボンヌ。 /(^.*key.*$)/$1/ じゃダメポ。 というのも、とあるテキスト書換えソフトでgrep出来たらいいなと。
>>135 foreach(@hoge)
{
if(/^.*key.*$/)
{
push(@a,$_);
}
}
で、良いじゃん。正規表現が合ってるかはは知らんけれど
138 :
nobodyさん :03/01/22 12:04 ID:Lm4zDQtU
>>136 grepが使えたらこんな事はしないかと。
>>137 if等は使えないんですよ。
つまりエディタの検索、置換えに指定する事でgrepするようなものです。
>>138 >つまりエディタの検索、置換えに指定する事でgrepするようなものです。
?
使えない理由になるの?
140 :
nobodyさん :03/01/22 14:10 ID:Lm4zDQtU
>>139 例えですけど、メモ帳の置換えでif使えますか?
マクロじゃないですので使えないです。
>>140 何を訳のわからんことを。
例えダイアログで指定出来るパラメータが一つでも、内部処理ではアホほどif文が多用されているが。
>>141 内部処理にいくらIFが使われてようが関係ないぞ。
って何の話してるんだ?
エディタの中の人も大変だな
145 :
nobodyさん :03/01/22 16:47 ID:Lm4zDQtU
>>141 何か大きく勘違いなされてるようで。
とにかく、1行(s/find/rep/)の構文だけでgrepと同じ事を出来ないかと言う事です。
スクリプトを組めるなら最初からそうしますが
制約上そのような事ができません。
>>145 何か根本的に勘違いなされているようなので。
147 :
nobodyさん :03/01/22 17:30 ID:Lm4zDQtU
>>147 はじめから落ち着いて、
・一体どんなアプリケーションを作っているのか。
・一体そのアプリケーションのどの処理で悩んでいるのか。
・ifが使えない制限とは?
位は書いてくれい。
149 :
nobodyさん :03/01/22 17:56 ID:Lm4zDQtU
>>148 ・使ってるソフト。
よくあるファイル一括書換えソフト。
・やりたい事
メモ帳の置換え(CTRL+H)のような感じで
検索する文字と置換えする文字を指定する事で
ファイルの内容を一気に高速で書き換えられる。
検索文字列及び置換え文字列はBREGEXP.DLLを使う事で
Perlと同等の置換えが指定できる。
その検索文字列と置換え文字列の指定方法。
・IFが使えない理由。
メモ帳のように検索文字と置換え文字を指定する事しか出来ない為。
ソフトを作ってる訳ではなく使っているだけ。
です。以上で分かって頂けるでしょうか?
>>149 はじめからそう書いてくれれば良かったのにね。
無理でしょ。
151 :
nobodyさん :03/01/22 18:06 ID:Lm4zDQtU
Perlで描いてドロップレットで一発変換。
153 :
nobodyさん :03/01/22 22:05 ID:NkPjRdCp
あ、わかった。
>>135 は、
正規表現は、置換にも使えると聞き、検索っていうとこで、正規表現をオンにして、
自慢のコードをつっこんでみたが、ちゃんと動かないので、調べるのは面倒だから、
2chに書き込んでみた。でどうだ。
で、さらに、正規表現∈Perlだと思っている。と。
キボンヌって言えば仲間になるから大丈夫だと思っていたら大間違いだぞ。
>>144 ああ!ごめん、見逃してた!反応遅くなっちゃってごめん。
・・・では改めて。
中 の 人 な ど い な い !
158 :
nobodyさん :03/01/28 00:31 ID:2+2ZA9Pr
ググル(crawl4.googlebot.com他)が来たら〜するというプログラムだけど、 if($ENV{'REMOTE_HOST'}=~/crawl[\d]+\.googlebot\.com/){⊥} でいいのけ?
>>158 $robots = "crawl4.googlebot.com";
if($robots =~ /crawl[\d]+\.googlebot\.com/ ){ print "kita----!!";}
をローカル環境でテストしてみる。
160 :
nobodyさん :03/01/28 16:58 ID:Go6r3Moz
DNSでは、大文字小文字を区別しないので、iを付ける。 それから、後方一致で調べればいい。 ↓普通はこう。googlebotドメインだったらいいんでしょ? $ENV{REMOTE_HOST} =~ /\.googlebot\.com$/i ↓\dを使うなら、こう使う。\d = [0-9]なので $ENV{REMOTE_HOST} =~ /crawl\d+\.googlebot\.com$/i
161 :
nobodyさん :03/01/29 11:03 ID:aizQjUQ4
2chのトリップなんですけど、 $salt =~ s/[^\.-z]/\./go; の [^\.-z] これって、具体的にはどれを表すんですか?
162 :
nobodyさん :03/01/29 13:00 ID:w0j+LU9j
>>161 ./0123456789:;<=>?@
ABCDEFGHIJKLMNOPQRSTUVWXYZ
abcdefghijklmnopqrstuvwxyz
↑以外
163 :
nobodyさん :03/01/29 20:26 ID:VPOVuFRE
>>135 s/^(?:(?!foo).)*$//
でどうよ?
>>150 能無しが煽ってんじゃねーよ。
165 :
nobodyさん :03/01/29 21:40 ID:aizQjUQ4
166 :
nobodyさん :03/01/29 21:45 ID:Jsuq0iRw
next if ($title !~ s/$word/<B>$&<\/B>/i); で、$word に「エロ」を入れてやると、「トロ」という言葉にもマッチするんですが、 何故でしょうか?
>>166 最後の i のせい。
「エ」の2バイト目は "G"
「ト」の2バイト目は "g"
i をつけると大文字小文字を区別しなくなるので、この2つがマッチする。。
>>164 ( ´_ゝ`)フーン
能無し君がまだ初心者相手に威張る為ここに居たんですか。
まぁ分からない事聞かれて逆切れしてるような貴方にはここがお似合いですね。
( ´,_ゝ`)プッ
171 :
質問者 :03/02/02 12:33 ID:aPQL5QO2
複数のor条件な文字列を検索したいとして、 一回の検索で、マッチした文字列がどの条件にあたるかを知ることが出来る? たとえば 対象文字列: abcdefg 検索語彙: (ab)|(fg) こういうとき、"ab"と"fg"がマッチするということはわかるが マッチした文字列がそれぞれどの条件だったのかを知りたい。 BREGEXP(Perl5)もしくはVBRegularExpressionで。 一回の検索では無理?
>>171 プログラム板に帰れ!
とかいって遊んでみる。
$1に入ってないか?
173 :
質問者 :03/02/02 12:39 ID:aPQL5QO2
>>172 実はプログラム技術板から来た。
正規表現スレがあるのはこの板だけっぽい。
マッチ文字列を取得することは可能なのだが、
何にマッチしたのかを確かめるためにはどうすれば‥‥?
>>173 つぅか誘導したのはこの俺だ。
マッチさせたい文字列は自明(自分で設定したんだからな)なのだから後はifとeqで比較すればどうだ?
175 :
質問者 :03/02/02 17:45 ID:aPQL5QO2
>>174 そか、どうも。
マッチした文字列を検索文字列と比較するということ?
>>171 で書いた例についていえばそのとおりだが
正規表現でマッチさせたものについて知りたいので
単純にifで比較してもしょーがない。
(検索文字列が"a."などのとき、比較してもしょうがない)
かといって正規表現でテストするってのも二度手間だし。
正規表現でうまく書けば出来るとか、
普通そーゆー機能あるよ、とかいうことはないですかー?
? $x =~ /(ab)|(cd)/; if($1 eq "ab") { print("ab"); }
perlなら、もう一度マッチングさせるかな。 なるべく別々に処理を行うようにするけど。 VBとかの機能はマ板で訊いてください。
>>177 >マ板で訊いてください。
・・・なぜ!?
179 :
質問者 :03/02/02 18:20 ID:???
>>176-177 ありがと。
もしかして知らないところで世の中便利になってて
一撃で出来るかなーと思ったのですが。
とりあえずあきらめときます。
180 :
177 :03/02/02 18:57 ID:???
もげ
183 :
nobodyさん :03/02/17 07:11 ID:tFA1sH7S
/hoge/piyo/foo\/bar/baka/ という文字列を split して [ 'hoge', 'piyo', 'foo\/bar', baka ] という配列を得たいのですが、/ で split するけど \/ では split しない ってのはどう表せますか?
[^\\]\/
>>184 バックスラッシュを一般化して使いたい場合を考えると split するより
my $path ='/hoge/piyo/foo\\/bar/baka/';
my @nodes;
foreach my $elem ( $path =~m%(?:^|\G/)((?:\\.|[^/])+)%g ){
$elem =~s/\\(.)/$1/g; # バックスラッシュを取り除く場合。
push( @nodes, $elem );
}
みたいなのの方がいいと思う。
これだと
/hoge/piyo/foo\/bar\\/baka/ => ['hoge','piyo','foo/bar\','baka']
みたいなのにも対応出来るし。
s///g 使って無理矢理1ステートメントにするのもアリか。
186 :
183 :03/02/17 11:44 ID:???
ありがとうございました
FYI @hoge = split m[(?<!\\)/], $path;
strong 要素内の“</p><p>”を取り除くため、以下のように書いてみたんです。 while ($value =~ /(<strong>.*?)<\/p><p>(.*?<\/strong>)/) { $value =~ s/(<strong>.*?)<\/p><p>(.*?<\/strong>)/\1\2/g; } ※ $value に HTML が入っている。 初めはこれでも問題なかったんですけど、例えば、 $value = "<p><strong>あ</strong></p><p><strong>い</strong></p><p><strong>う</strong>"; のとき、置換後の $value は、 $value = "<p><strong>あ</strong><strong>い</strong><strong>う</strong>"; となってしまいます。この書き方で大丈夫だと思っていたのに、どうなってるんでしょうか・・・
>>188 <strong>.*?</p><p>.*?</strong> だと、
<strong> => <strong>
あ</strong> => .*?
</p><p> => </p><p>
<strong>い => .*?
</strong> => </strong>
ってマッチしちゃうよ。
$value =~s{<strong>(.*?)</strong>}{
my $tmp =$1;
$tmp =~s|</p><p>||g;
"<strong>$tmp</strong>";
}ge;
とか。もっと良いやり方ありそうだけど。
190 :
188 :03/02/18 19:13 ID:???
ごめんなさいごめんなさい。もの凄く馬鹿なことを書いてしまいました。
あまりの睡魔に襲われて、今 コタツで寝ながら考えていたのですが、私の書き方だと strong 要素内に </p><p> がない場合を考えてないわけですよね。
本当に申し訳ございません・・・
>>189 有り難うございます。
教えて頂いた方法ですが、あとで勉強しながら考えてみます。
どうも私ではすぐには理解できそうにないもので。
とにかく有り難うございました。
眠い時って、まともなprog書くの無理だよな。
192 :
nobodyさん :03/02/18 23:46 ID:oZOSGD0m
正規表現を初めて2日目です(ごめんなさい)文字列の置換だとか検索に感動してます(申し訳ない)。 正規表現を勉強し始めた理由は、以下の質問からです。 192.168.1.8が、192.168.1.0/24 のネットワークアドレスに含まれているかどうかを 判定する正規表現を書くことは可能でしょうか。 よろしくおながいします。
人間用表記から、ビット列に直して、ビット演算で適当にやったほうが速いような気がするぞう。
>192.168.1.8が、192.168.1.0/24 のネットワークアドレスに含まれているかどうかを ならtrueなのは自明だけど。
195 :
192 :03/02/19 00:13 ID:bka3cebn
>>193 ありがとうございます。やっぱし、正規表現よりは普通にプログラムで
やったほうが良いですか、、ちなにみJava使いです。んー、書いたことないので
なやみます。
>>195 無視された・・・Java.util.regex使いなのに無視された。
ビットマスクが8の倍数なら正規表現でも簡単だけど・・
あぁ。サブネットマスクだった。
正規表現雑技団とかでやりそうなネタだな。
200 :
192 :03/02/19 02:16 ID:bka3cebn
>>196 ええ、あれ、なんか、無視しちゃうような悪いことしちゃいましたか?
すいません、何かサンプル教えて下さるとうれしいす。。。
これがスッキリとした正規表現で書けるっていうなら見物だな。
202 :
nobodyさん :03/02/19 16:59 ID:oL6d+rQl
select * from testtable where name = 'hoge's name'; という文字列があり、 name = 'hoge's name'の、内側の'だけをエスケープして置換えたいのです。 つまり select * from testtable where name = 'hoge\'s name'; としたいのです。 ただし外側の'は必要ですのでエスケープしたくないのです。 込み入った例を書くと文字列が name = ''''' and value = '''' の場合は、 name = '\'\'\'' and value = '\'\'' にしたいのですが、このような複雑な処理を正規表現で行うのは無理なのでしょうか?
>>202 > 込み入った例を書くと文字列が
> name = ''''' and value = '''' の場合は、
最大マッチでも難しそう・・・
無理だろう、これは。 SQL だと 文字リテラルのでてくる場所たくさんあるから 個数限定ってわけにもいかないし。 対になってるわけでもないし。 '' ' ' '' ' ' ' ' こんな文字列からクオートすべきのを見つけろ、ってのとかわらんもん。 どういう案件かはわかんないけど、 SQL に置き換える段階でクオートしなかったのが敗因ですね…
206 :
nobodyさん :03/02/21 12:55 ID:6n4aSTAx
>>203-205 了解です。
楽しようとせずSQL文を完成する前に
ひとつずつ置換えるようにします。
どうもでした。
せめて一行に一回しか出て来ないとか、''の両端は必ず空白とかの目印があればいけそうだけど。
209 :
nobodyさん :03/02/21 22:45 ID:Kv1GvIlP
初歩的なあれですが、()のなかに()があって、 そのなかに | があっても大丈夫ですか? /(2ch\.net|1ch\.(com|org))/ みたいな・・
>>209 .に行っているように\でエスケープしてください。
>>209 えっと・・あとどれをエスケープするんでしょうか?
この場合合致させたいのは
2ch.net
1ch.com
1ch.org
です
てゆーか、それくらいとっとと自分で試してみればいいのに。
でもまあ、サーバー上でしか実験出来ないような環境作っちゃった場合は 聞いた方がはやいやーってなっちゃうだろうね。
>>214 >でもまあ、サーバー上でしか実験出来ないような環境作っちゃった
それ、何もしてないってことじゃん。
216 :
初心者質問者 :03/02/22 17:49 ID:Db6aP06C
ダブルクオーテーションで括られた文字列の、 ダブルクォーテーション内部だけをマッチさせたいんですけど。 $1使わないと無理?
>>216 "が偶数回出てきてる行は囲まれてるな。
>>214 ActivePerlでもなんでも入れれば一発だろうにな。
怠惰な奴は嫌われる。
219 :
nobodyさん :03/02/24 12:33 ID:fQYme6i5
質問です。 ある文字列から始まらない任意の文字列、というのは どうなって書けばいいんでしょうか。 例えば、<a href...>以外のタグを見つけるといった場合ですが、 文字列a hrefから始まらない、という事で /<[^(a href)][^>]*>/ という感じかと思ったんですが、これではダメなようなので・・・。
>>219 !~ /^ある文字列から始まらない任意の文字列/
この場合、否定先読み、否定後読みを使うんじゃないかね?
Perl5の場合は、正規表現の拡張構文を使うとこんな感じ。 /<(?!a href).+?>/
223 :
nobodyさん :03/03/03 16:51 ID:PjU+W5oK
前スレに似たような質問を見つけて読んだけど・・・ なんか「知らんヤツ書くな!!」とかで正しいのかどうか解りません。。 どなたかご教授お願いします。 言語:Perl 掲示板CGIを作っています。 やりたいこと:特定のタグ以外は無効にする。 私が考えた処理は・・・指定したタグの中身に合致しなかったら消す。 @yukotag = "('b'.'/b'.'u'.'/u')"; if ($value ne "<@yukotag>") { $value =~ s/<(.*)>//g; } でもこれではそもそも動かない・・・エラーにはならないけど。 #有効になるべきタグも消えてしまいます・ どうしたらよいのでしょう。
224 :
223 :03/03/03 16:53 ID:PjU+W5oK
もう一個考えた・・ if ($value ne "<(b|\/b)>") { $value =~ s/<(.*)>//g; }
全てのタグをエンティティに変換し、その後許可タグだけ戻すのが王道。
>>223-224 Perlを基礎から勉強してください。
基本的な考え方は
>>225 の通り。こんな感じで。
@yukotag = ('a','u');
$value =~ s/<(\/?.*?)>/<$1>/g;
map { $value =~ s/<(\/?$_.*?)>/<$1>/ig } @yukotag;
227 :
nobodyさん :03/03/05 12:28 ID:vWidvRyz
改行二回にマッチさせたいんだけど $_=~/\n{2,}/g ではだめれすか?
my $kaigyou = '(?:・r・n|・r|・n)' $_ =~ /${kaigyou}{2,}/$nanika/g
230 :
227 :03/03/05 12:37 ID:???
マッチしませんれした
232 :
230 :03/03/05 22:23 ID:???
$a="aaa\nddd\nfff\n"; if($a=~/\n{2,}/gs){print"OK!\n";} ?????????????????????????????
>>232 おいおい、「改行ニ回」ってそういう意味かよ。
上の回答者はみんな、あんたが「ふたつ(以上)連続する改行」に
マッチさせたがってると思ったんだよ、あんたの質問と例を読んで。
$a = "aaa\nddd\nfff\n";
if(($a =~ s/\n/\n/gs) >= 2) { print "OK!\n"; }
235 :
230 :03/03/06 03:31 ID:???
スマソ 激しく反省
ネストした括弧へのマッチを一つの正規表現で表すことってできるかな。 ((a.b)(c.d)(e(f(g.hij)))k) -> マッチ ((bcd))) -> だめ。
>>236 無理。
正規文法の限界。
(文脈自由文法以上ならいける
238 :
サチ :03/03/08 13:12 ID:dLehQyhy
@data=("a","b","ゝ","⊂","≡","⌒","▼","≧","∂"); my $count = 0; foreach (@data) { $count += $com =~/\Q$_\E/; …… この ~/\Q$_\E/ ってどういう意味なのでしょうか? 厨房的な質問ですみません。
>>238 それは正規表現というよりPerlの作法。
\Q =英数字以外の文字の前に\を挿入する。
\E =\L,\U,\Qなどの終了
print "\Q$_\E";
とかで効果を見たほうが早いかも。
241 :
サチ :03/03/08 13:32 ID:dLehQyhy
あまりに早いご返答ありがとございます。 本当にありがとうございます。 Perlの作法なのですか。 てっきり正規表現かと思ってました。(^_^; どこかに参考となるURLありますか?
244 :
サチ :03/03/08 13:37 ID:dLehQyhy
あっ、その”Perlの作法”がまとめられたトコがあるのかと 思いまして… ごめんなさい。
246 :
サチ :03/03/08 13:54 ID:???
これから買いに逝って来ます。 ありがとうございました。m(_ _)m
それを知るためだけにラクダ本を買うのか…… まあ、がんばれよ。
>>247 今頃びっくりのお値段に悶絶してることかと。
3rd だと2冊だし。 デスクトップリファレンスで良いかと。
いや、これをきっかけに Perl ヲタになるやもしれん。 同じオライリーなら詳説正規表現もお勧めだよ。
251 :
サチ :03/03/08 18:13 ID:???
高かぁ〜い!ヽ(`Д´)ノ お金がないので諦めました。 詳説正規表現ですか。。φ(..)
よく入門書で、「正規表現を詳しく解説してると本が1冊書ける」とか書いてるけど 本当に本1冊書けるし、実際に本が出てるんだよね。 それぐらい奥深いものなのかと。
俺はソフトバンクの「正規表現の達人」持ってる。 他にも赤い表紙の奴とか、オライリー以外にも2、3冊ぐらい 正規表現の本を見かけたことがある。
254 :
177 :03/03/08 20:46 ID:???
詳細も高いって(w。
255 :
254 :03/03/08 20:47 ID:???
おっと、詳説でした。
でも詳説は勉強になったよ。 あれ勉強してからチューンしたら性能が4割は上った。 はじめは馬鹿にしてたんだけどね。
確かにいい本です。 正規表現はスクリプトの実行速度に影響を与えていることが 結構あったりしますので、コードチューニングには、いい本です。 しかし、入門には少々マニアックすぎるかも。 # 毒食えば皿までかな。
>>237 Perl5.6以降では(??{})でいけたような。
もはや「正規表現」とは言えないわけだがだいぶ前から
Perlの正規表現は厳密な意味で正規表現じゃないし
>>251 忘れてた。Perlに限るなら、EffectivePerl(3章)をおすすめ。
260 :
nobodyさん :03/03/09 12:49 ID:9EZ5B9RA
JavaでOMOつかってます。matchで「aaabbbcccdddd」という文字列に対し、 aもしくはdという文字列が含まれているかという判定を正規表現で書きたいのですが… 超初心者ですんません。
262 :
260 :03/03/09 16:47 ID:???
ありがddd
263 :
nobodyさん :03/03/11 10:43 ID:V1nwV3pf
「次の言語に対する正規表現を書きなさい 0と1からなる列で0は偶数回、1は奇数回現れるもの全て。」 わからない…。ていうか可能?
>>263 (00)* 偶数=2n
(11)*1 奇数=2n + 1
267 :
名無しさん@Meadow :03/03/11 11:16 ID:wliWOweu
>>263 Perlだしゅ。正規表現じゃないな。
while(<>) {
@zero=m/0/g;
@ichi=m/1/g;
if ($#zero % 2 != 0 and $#ichi % 2 == 0) {
print;
}
}
>>263 その問題文、「次の言語に」って言い回しからしてなんか怪しくない?
>>268 どういうこと?原文ままだと
*3.7 次の言語に対する正規表現を書きなさい.
a) 5個の母音a,e,i,o,uがこの順序でどこかに現れる英字列すべて
b) 辞書式順序の関係に従って現れる英字列すべて
(略)
f) 0と1からなる列で,0は偶数回,1は奇数回,現れるものすべて
(以下続く)
「コンパイラI 原理・技法・ツール」(通称ドラゴンブック)ていうやつの練習問題。
>>269 ソレ、学校の課題かなんかじゃねえの?
それなら自分でやれよ。
もし違うならスマソ
>>269 普通なら「次の文字列に対する〜」だと思うが。
言語?
ところで。 オライリージャパンの「正規表現」って本読んだ。 ちょっと古めなのであれだったけど。 (\4000) 書いてある内容はあれだったけど、 説明のしかたがクソだった。 よくオライリーからあんなクソ説明本が出たもんだ。 読んでる途中で嫌になってくる。
>>270 いや、ただ気になったので。この類の本って問題だけで答えがないってのが
多い気がする。
>>271 「言語」はあるアルファベット(文字集合)からなるものの列をいうっていうようなことが
書いてあるので、たぶんここでは文字列っていうのと同じとみていいと思う。
「言語 受理」で検索するとそれっぽいページが多くヒットするので分野によっては
普通の表現なのかも(「受理」はまぁつまり「マッチが成功する」って言う意味)。
あぁー分からないよぉ。。もちろんPerlの拡張正規表現は使わないんでしょ?
>>275 あんたが何がわからないかわからないのだが
278 :
nobodyさん :03/03/12 22:04 ID:hmpHRxfR
2ちゃんのスレッドのソースから名前だけ取り出す正規表現ってどうすればいいですか?
279 :
nobodyさん :03/03/12 22:31 ID:wNWBQmqk
>>272 たぶんあなたのレベルの問題だと思うぞ。
あと2,3回我慢して読んでみなよ。
.* と .+? の違いって何ですか??
あぼーん
>>280 前者にヒットして後者にヒットしないものは空文字列くらいかな。
あれ、 (x?) って (|x) の略記法だと思ったんだけど。 だから空にもマッチするんじゃないの?
>>285 その"?"と、
>>280 の"?"では意味が違います。
>>280 の"?"は量指定子(この場合は"+")の後ろにありますので、
これは「最短のマッチを選べ」という指示になります。
結果として、".+?"は「何か一文字」にマッチするということになりますね。
287 :
山崎渉 :03/03/13 16:58 ID:???
(^^)
>>286 なるほど、"+?" で一つのメタ記号なんですね。ゴミレススマソ
293 :
nobodyさん :03/03/14 00:05 ID:s293/lDl
293get
{0,1}という意味での?と、 * +の後ろにくっつけた?は意味が違う。 だから、*? +?で1つのメタ文字として考える方が正しいといえる。
>>294 *?とか+?は、メタキャラクタのみで構成されているってだけの話で、
所詮は正規表現の1パターンでしかないと思ふ。
量指定子の後ろに「?」をつけると「最短一致」
だから
>>280 は間違いと。やっとわかったよ。
300 :
nobodyさん :03/03/20 21:24 ID:8BKMA1mq
302 :
nobodyさん :03/03/26 17:02 ID:4WzRK9Se
文字列の中で、「;」を消したいんだけど「<」や「>」の「;」は そのままにしておきたいような場合はどのように表記すればいいんでしょうか? s{[^(?:&|<|>|")];}{}g とか s{[^&|<|>|"];}{}g とかやってみましたがうまくいかず。 どなたか助けてください。
303 :
302 :03/03/26 17:16 ID:4WzRK9Se
↑間違えました。 文字列の中で、「;」を消したいんだけど「<」や「>」の「;」は そのままにしておきたいような場合はどのように表記すればいいんでしょうか? s{[^(?:&|<|>|")];}{}g とか s{[^&|<|>|"];}{}g とかやってみましたがうまくいかず。 どなたか助けてください。
>>303 Perlならこれでどうだ
s/(&(amp|lt|gt);)|;/$1/g
s/(?<=&\w+);//g
306 :
nobodyさん :03/03/27 01:45 ID:lpoVliEY
はじめまして。正規表現覚えたての者です。 if($FORM{'pass'} =~ /[0-9]pass/) わかると思いますが、これは$FORM{'pass'}が[0-9]passだったら○○する、という命令なんですけど、 この0から9を0から24にしたいんです。 if($FORM{'pass'} =~ /[0-24]pass/) これじゃあ0から2と認識されてしまいました。 どうかご教授お願いします。。
307 :
nobodyさん :03/03/27 02:14 ID:DK9B1aQJ
>>306 if($FORM{'pass'} =~ /(1?[0-9]|2[0-4])pass/)
でいいんじゃないかなあ。
308 :
nobodyさん :03/03/27 02:20 ID:DK9B1aQJ
>>306 if($FORM{'pass'} =~ /(\d+)pass/ && $1<24)
とかでもできるかなあ。
309 :
nobodyさん :03/03/28 10:31 ID:q5wWnzii
なんらかの文字列がn回以上続く という書き方はどうすればいいのでしょう? /.{10,}/ こう書いたのですがなんでも10回続けばマッチしてしまう(10文字以上の長さだったらマッチ) kふぉあsdん@ごあsdんg@おあんう゛ぁ@おsなおさkんが@おsんdg@お にマッチせず、 あいうえお!!!!!!!!!!!!!!!! や、 あいうえおあいうえおあいうえおあいうえおあいうえおあいうえおあいうえおあいうえおあいうえおあいうえお などにマッチさせたいんですが、どういう書き方をすればいいのでしょうか? どうぞ、よろしくお願いします。
>>309 意味不明
kふぉあsdん@ごあsdんg@おあんう゛ぁ@おsなおさkんが@おsんdg@お
コレだって10文字以上だろ
人間にとって意味がある文章を洗い出すって意味なら無理
>>309 /(.+)$1{9,}/ じゃダメ?。あんましオススメしないけど。
312 :
309 :03/03/29 03:39 ID:WGdDwe6j
すいません、言葉が足りなかったようですね。。。
なんらかの文字列がn回以上続く
↓
なんらかの文字列が連続でn回以上続く
「連続」で続いてないとだめなんです。
だから、
kふぉあsdん@ごあsdんg@おあんう゛ぁ@おsなおさkんが@おsんdg@お
は、マッチしません。
あいうえお!!!!!!!!!!!!!!!!
は、「!」が10個以上あるのでマッチします。
あいうえおあいうえおあいうえおあいうえおあいうえおあいうえおあいうえおあいうえおあいうえおあいうえお
は、「あいうえお」が10個以上あるのでマッチします。
こんな表現は無理なんでしょうか?
>>311 これでは無かったです。
単にn文字以上、ではなく、連続で続くとマッチさせたいんです。
$str = q|kふぉあsdん@ごあsdんg@おあんう゛ぁ@おsなおさkんが@おsんdg@お|; if ( $str =~/(.+)\1/ ) { print 'OK'; } else { print 'NG'; }
Perlメモのやつを使えば、全角文字も1文字として扱える
半角しか考えないバージョンの答えはこれ。多分 /(.+)\1{N,}/ Nはn - 1で。
316 :
309 :03/03/29 22:08 ID:xi1Z4LcN
318 :
309 :03/03/31 00:38 ID:rrn9gB8/
お〜!!
すいません、
>>315 サソのでいけました!
みなさんどうもありがとう・゚・(ノД`)・゚・
319 :
309 :03/03/31 00:50 ID:???
あ、でも半角だけか。。。(´・ω・`)
Perlメモから、文字の正規表現を持ってくればできる。EUC-JPのみ対応 $ascii = '[\x00-\x7F]'; $twoBytes = '[\x8E\xA1-\xFE][\xA1-\xFE]'; $threeBytes = '\x8F[\xA1-\xFE][\xA1-\xFE]'; /((?:$ascii|$twoBytes|$threeBytes)+)\1{N,}/
あ、でも
>>315 でも2バイトの繰り返しとして判断されるから、
ちゃんと動く(ように見える)かも。ずれた時は…
? (十進数) {2,4} ; ?x (十六進数) {,4} ; でない #(任意の16文字) にマッチさせるにはどうしたらよいですか。
>>323 同じくわけわか
任意の16文字にマッチさせたくないものを書いて
326 :
nobodyさん? :03/04/05 04:37 ID:bmLMbrZJ
$str = '123 名前:<font color="#008800"><b> nobodyさん </b></font>' から <b></b>タグで挟まれた文字列(レスの名前部分)だけ残す場合、どんな方法がありますか? $str =~ /<b>([^<]+)<\/b>/; $str = $1; $str =~ s/.*<b>([^<]+)<\/b>.*/$1/; ってのはエレガントじゃないですよね
($str) = $str =~ /<b>([^<]+)<\/b>/; これじゃだめ?
>>327 配列コンテキストだとマッチした文字列の配列をを返すんですね。
なるほどサンクスです。
>>323 の?は、半角の&です、、、
化けてしまった。
半角の&#だった、スマソ。? &#
331 :
デフォルトの名無しさん :03/04/05 11:11 ID:E+nPGg0Q
>>330 わけのわかるように書け、といてるのがわからんかな。
(a) /#.{16}/ # '#'に続く任意の16文字じゃ
(b) /?[0-9]{2,4}/ # '?'に続く十進数2個〜4個じゃ
(c) /?(x[0-9a-z][0-9a-z]){,4}/ # '?'に続く十六進数表記0個〜4個じゃ
(a)は、(b)でも(c)でもないから、(a)がおぬしの求める解そのもの
ではないのかの。
(b)も(c)も含まぬ(a)をマッチさせたいのではないのかの。
それなら別の問い方がある。日本語をべんきょし直してこい
332 :
nobodyさん :03/04/05 14:40 ID:7kbMg08s
\nああああ 2003/6/08\n\nsdfg 2004/9/9\n\nぉいこいjk\n から最後の\n〜\nを消したいのですがどうすればいいですか? 結果的に \nああああ 2003/6/08\n\nsdfg 2004/9/9\n というふうにしたいのですが
$ perl -e '$_="\nああああ 2003/6/08\n\nsdfg 2004/9/9\n\nぉいこいjk\n";s/\n[^\n]+\n$//;print'
>>332 join('\n',(split(/\n/,"\nああああ 2003/6/08\n\nsdfg 2004/9/9\n\nぉいこいjk\n"))[0..3])
こじつけ(w
335 :
332 :03/04/05 17:02 ID:7kbMg08s
すいません\nは改行ではなく文字として扱いたいのですが
>>331 > (b)も(c)も含まぬ(a)をマッチさせたい
そうです。
質問者の癖に揚げ足を取っとくと、
(C)は [0-9a-fA-F]。
「純粋な正規表現」ではできないのですか?
Perlなら下記でいけそうですが。
/(?<!&)#.{16}/
?(数字); にはマッチしなくて
?(文字); や?(;以外の任意)にはマッチ なんてできませんよね?
マッチさせてから考える、っということにしよう。
言ってることがわけわかだから終了でいいだろ
この板って、&がかけないのか? 同じpc2鯖でもweb製作は使えるのに。 テスト & &です。 &amp; &です。 &# ?です。
どんなログ形式になってるのか知らないけど、ログの1行を空白で分割すると、 決まった場所にメールアドレスが来てない?
>>341 ログのフォーマットぐらい書けよ。
その内容によっては正規表現じゃなくたってできることあるし。
>>342 ,325
そうですね。
OEのメッセージをテキストで保存したものですが、
----↓一行目から----
送信者: <
[email protected] >
宛先: <
[email protected] >
件名 : テスト
日時 : 2003年4月9日 17:33
--------------------
てな感じになってます。
ヘッダ部分は決まった場所なんですが、
本文中のメアドも消したいんです。
346 :
nobodyさん :03/04/10 01:00 ID:+Bf7VwF4
どのくらい厳密にメールアドレスを考えるか、って問題?
メアド部分を探し出し空白に変換すればいいわけですね。
>>344 メールアドレスの正規表現はググればいくらでも見つかるでしょ
どっちみち、perl5.6以前は完全には表せないけどあまり支障はないと思う
349 :
nobodyさん :03/04/10 03:20 ID:vlrWfcuj
あまり知障はないと思う
あぼーん
あぼーん
あぼーん
341の母でございます。(・・・ってパターンは古すぎだな)
もまいらオススメのMail Addressの正当性チェックパターンを是非341に押しえて
ください。
教科書的には
/^[\w\-+\.]+\@[\w\-+\.]+$/i
・・・って事になるかもしれないけど、これだとage@sageでも通ってしまいまふ。
http://www.din.or.jp/~ohzaki/perl.htm#Mailは現実的じゃないし 、perl上で@で
splitして要素数数えてから左辺右辺を個別に評価した方が確実なんでしょうけど、
ここは正規表現一発って事でおながいします。
/@/
>>353 現実的ってのがよーく解らんので答えようがないんじゃけど
まず、@より左に使える文字の一覧希望。
>>356 今のところあまり使われてはいないものの、ほとんどどんな文字でもだね。
>>353 後半を
@[\w\-+\.]+\.[\w\-+\.]+
にするんじゃだめ?
実際にSMTPに繋いでみる。
実際に送信して、エラーが帰ってくるか試してみる。
>>356 空白と@を除く全ての1バイト文字とは違うの?
ドメインにより制限があるが、流動的になり得るので、
ドメイン別の場合分けは無意味と思う。
(1バイト文字=A-Z,a-z,0-9,キーボードから打てる記号)
それを言うなら印字可能文字
363 :
nobodyさん :03/04/15 12:10 ID:GI84bLWk
先頭と最後にダブルコーテーションがない場合は ダブルコーテーションで必ず囲みたい! "aaa → "aaa" aaa" → "aaa" aaa → "aaa" どうする?正規表現!
364 :
nobodyさん :03/04/15 12:18 ID:VH8m0AHo
s/^\"?([^\"]+)\"?$/\"(\1)\"/;
365 :
nobodyさん :03/04/15 13:14 ID:x65/25rD
>>364 ありがとうございます。
でも実行してみたら
"aaa → ""aaa
となってしまいました。。
>>365 まじで?
私は、余計なかっこがついてきたよ。
だから、こう書き直したら、直ったよ。
s/^\"?([^\"]+)\"?$/\"\1\"/;
367 :
nobodyさん :03/04/15 14:26 ID:fimoekOy
>>366 ありがとうございました。
直りました。
それだと"が途中に入ってる場合にうまくいかない。 それから、正規表現中の"は意味は無いからエスケープする必要は無い。 で、自分ならこう書く。 s/^"?(.*?)"?$/"$1"/
369 :
nobodyさん :03/04/15 18:25 ID:W26JC1si
「超」にマッチ、但し「超クール」の場合にはマッチしない、ていうのは どうするんだろう・・・ 超バッド←「超」にマッチ 超能力←「超」にマッチ 超クール←マッチしない /超^(クール)/ じゃダメらしい・・・ unless(/超クール/){ if /超/ 以外でひとつ・・・
(?! ... )
371 :
369 :03/04/15 18:32 ID:???
>>379 即レスありがとう!
超(?!クール)
でマッチしますた。ていうか漏れの持ってる本に載ってないよ・・・捨てるか
5回以上の改行を一回の改行に置換したいのですが、上手くいきません。 \n{5,} マッチしませんでした \n\n\n\n\n マッチしませんでした どなたかお願いします・・・。
あぼーん
>>372 s/\n{5,}/\n/gs ←この最後のsはつけました?
改行コードが統一されていないとか。
Perlの拡張じゃなかった? (?! ) (?= ) とか。そういうのは断り書きしたほうが委員でないか
ツールによって文法も使える表現の範囲も違うから 何を使ってやりたいのかをちゃんと書いたほうがいいと思う
>>377 何を使って: bregexp.dll使用のテキストエディタ
やりたいこと: 5回以上の改行は1回にする
です。
379 :
nobodyさん :03/04/15 23:21 ID:qSlvjoha
小さなパーサを作っていて,不等式を解析したい。左辺と右辺はそれぞれ一単語または""にはさまれた一以上の単語というルールがある。 で,具体的には不等式の左辺と右辺を取り出したい。 たとえば, $statement = q["abc de" > 123 or abcde = "zz zz"]; だと,"abc de"とabcdeが左辺,123と"zz zz"が右辺。 これを解析するために $operand = '(?:<=|>=|>|<|=)'; $var = '(?:\w+|"[^"]*")'; $statement =~ s/($var)\s*$operand\s*($var)/(left) $1 (right) $2/g; print $statement; とかすると (left) "abc de" (right) 123 or (left) abcde (right) "zz zz" という出力が得られる。 さて,
380 :
nobodyさん :03/04/15 23:22 ID:qSlvjoha
問題は左右辺を''でくくる場合も許した場合。たとえば, $statement = q["abc de" > 123 or abcde = 'zz zz']; の場合に (left) "abc de" (right) 123 or (left) abcde (right) 'zz zz' としたい。 $operand = '(?:<=|>=|>|<|=)'; $var = q!(?:\w+|("|')[^\1]*\1)!; #ここを変えた $statement = q["abc de" >123 or abcde = 'zz zz']; $statement =~ s/($var)\s*$operand\s*($var)/(left) $1 (right) $2/g; print $statement; だとまったく解析が成功しない。どうして?
あの、、長文テキストを指定桁数で改行する正規表現をどうやって書けばよいでしょうか。。 本を読んで2日目です、、、急に必要になってしまいました。おやさしいかた、おしえてください。よろしくおねがいいたします。
382 :
nobodyさん :03/04/15 23:35 ID:qSlvjoha
>>380 $statement =~ s{
(\w+|"[^"]+"|'[^']+')
\s*
(?:[<>]=?|=)
\s*
(\w+|"[^"]+"|'[^']+')
}
{(left) $1 (right) $2}gx;
385 :
nobodyさん :03/04/16 13:17 ID:QKerHoGZ
386 :
nobodyさん :03/04/17 11:44 ID:326c+Ekv
質問です。 ある文字列内に、所定の単語が含まれていない 場合を判定する正規表現を書きたいです。どういう書き方が良いですか。 [^abc] ですと、a,b,cのいずれかが含まれていない、という判定になってしまいます。そうでなく、abc という文字列が含まれていない、というのを判定したいです。
>>386 !~ /abc/g;
ではあきまへん?
>>386 処理系にもよるが、/abc/ の結果を反転したほうが簡単だと思う。
(?:(?!abc).)* とか perl,rubyあたりでしかつかえんよーな・・・
391 :
nobodyさん :03/04/19 16:06 ID:9ZhNrFm8
げっ・・・age忘れてた
げ。デリミタは/じゃだめだな。!とかにして。
396 :
386 :03/04/19 23:46 ID:???
色々アドバイスありがd。!abcでいけました。たぶん。。JDK1.4.1のregexです。
397 :
山崎渉 :03/04/20 05:59 ID:???
∧_∧ ( ^^ )< ぬるぽ(^^)
398 :
nobodyさん :03/04/24 17:15 ID:/44ojQ66
<script language=hoge>〜</script> の範囲を削除したいのですが、こんなんでいいんでしょうか。 s/<script[\s.\S]\s*(.*)\s*>[\s.\S]*<\s*\/script>//gi
399 :
398 :03/04/24 18:29 ID:/44ojQ66
その後あれこれ考慮して、 s/<script\s*.+?>.+?\s*<\/script>//gi これに落ち着いた感じなんですが、どうでしょうか?
s#<script[^>]*>.*?</script>##gi
s#<script[^>]*>.*?</script>##igs か。。
>>399 s/<script[^>]*>(?:(?!<\/script).)*)<\/script>//gi
とか・・・
s#<script.*?>.*?</script>##isg
s#<script.*?>.*?</script>##isg
405 :
399 :03/04/25 01:34 ID:fbvwVtSF
短くなるもんですね。。。
>>399 の記述でも、目的は達しているように見えるのですが、
ご教示頂いたものを試してみようと思います。
現在、コメントタグの削除に取り組んでいますが、
s/<!--[^>]*-->//g
これで、一応目的は達しているように見えます。
複数行またがるコメントタグも削除できているようです。
しかし、より効果的な記述方法はあるでしょうか?
>>405 コメントタグは < >が含まれることがある(というかブラウザー的にはエラーにならない)
のでそれじゃ駄目
あと、改行も問題有るので
s/<!--(?:(?!-->).)*)-->//gs
ぐらいにしとかにゃだめなんじゃない
408 :
405 :03/04/25 10:00 ID:EpsK+/d8
>>406 クスコです。試してみます。
>>407 情報源、クスコです。
Perlメモは読んでまして、そこのコメントタグも試しました。
ただ、あれでは意図しない部分まで削除してしまうケースがあるようです。
409 :
123 :03/04/25 10:36 ID:HCZY3VXf
javaの場合 ※jdk1.3は正規表現はつかえないから別のライブラリを使う(以下参照) ※jdk1.4は標準でついていたのでそれを使う(使い方忘れた、自分で探せ) String aaa = \"123456789\"; Pattern pattern_1 = compiler.compile("456",Perl5Compiler.CASE_INSENSITIVE_MASK); aaa = Util.substitute(matcher,pattern_1,000,aaa,Util.SUBSTITUTE_ALL);
410 :
405 :03/04/25 12:08 ID:EpsK+/d8
あぼーん
あぼーん
413 :
nobodyさん :03/04/26 00:57 ID:IuuTGNpA
/.+@[a-z0-9]+.[a-z]+/ メアドの正規表現ってこんな感じでいいの(初心者でつ)?
>>413 メールアドレスを完璧に表すのは難しいぞ
このスレを少し遡れば同じ話題あるよ
まだこっちのほうが良くないか? [^@]+@[a-zA-Z0-9\-_]\.[a-z]{,3}
/^[^\@]+\@(?:[0-9a-z_-]+\.)+[a-z]{2,4}/i
日本語ドメインはどうすんの?
>日本語ドメイン 無かった事にしてくれ。 (でも、確かRFC的には許容内なんだよな。鬱)
メールアドレスを正規表現でと言っても用途にもよるんだよな。 RFCに適合するかどうかのチェックなら厳密にやらなければならないし、 実際には許されない架空のアドレス風味を表すだけなら簡単だし。
/\@/; #完璧!
422 :
nobodyさん :03/05/07 01:48 ID:U7blGvbH
JavaのOROのPerl5Utilを使っています。 基本的には\が重なること以外にはPerl5と同じはずです。 これ↓を SELECT * FROM MEMBER WHERE {NAME='[personName]' AND }AGE=[age]{ AND TEL='[tel]'} ORDER BY AGE; こういう風に SELECT * FROM MEMBER WHERE AGE=[age]{ AND TEL='[tel]'} ORDER BY AGE; 変換したいのですが下記ではだめなのでしょうか。 /\\{.*?\\[personName\\].*?\\}//
メールアドレスなら @よりもあとを正引きしてMXレコードがあるかどうか 調べるとかどう?
正引きする必要はないか MXレコードがあるかどうかだけ調べてみるとか DNS鯖とか落ちてたら登録拒否できるから 確認のメール送る場合とか結構有効じゃない?
427 :
見習い中 :03/05/07 09:46 ID:l7Gf5uMD
突然の質問で恐縮です・・・ 今、正規表現を使って半角英数字のチェックを行っているのですが、 入力テキストエリアに半角英数字が入力されたら、エラーを出すように したいのですが、 if ($in{'name'} !~ /[a-zA-Z0-9\-]+/ ) { &error("エラーです"); } としたところ、半角英数字はエラーを返すのですが、 全角英字大文字(ABC)と全角数字(123)も反応してしまいます。 (ToT)... 全角英字小文字(abc)は反応しませんでした。。 半角英数字の入力のみエラーを返したいのですが、どなたか教えてください。
あぼーん
>>427 もしかしてAだけの入力ならうまく動作しませんか?
バイナリエディタを使ってABC周辺のバイトコードと
abc周辺のバイトコードを比較してみましょう。
430 :
427 :03/05/08 12:05 ID:0MiTKfYx
レスありがとうございます。。 いろんなサイトを調べてみたら、こんなのがあってやってみました。 jcode::convert(\$in{'name'}, 'euc'); if ($in{'name'} !~ /^[\xA1-\xFE][\xA1-\xFE]+$/ ) { &error("エラーです"); } とやったら、うまくいきました。(全角文字以外はエラーを返します。) jcode.plの力ということでしょうか。。。プログラムは奥がふかいです。。。
432 :
nobodyさん :03/05/10 18:06 ID:/HHBMizp
すみませんが質問させてください。
ニュースサイトからアンカータグの部分だけを取得してくるスクリプトを
書いていたのですが、htmlソースの一行の中に複数のアンカータグがあった場合、
その全てをきれいに抽出できないのです。例えば、抽出したい元のソースが
<a href="
http://aaa.com/ ">あああ</a>、<a href="
http://iii.com/ ">いいい</a><br>
のようになっていたとして、正規表現でそれぞれのタグにマッチングさせようとしても何故か
『<a href="
http://aaa.com/ ">あああ</a>、<a href="
http://iii.com/ ">いいい</a>』か、
『<a href="
http://iii.com/ ">いいい</a>』だけか、
『<a href="
http://aaa.com/ ">あああ</a>』だけといったようにしか抽出できず、
純粋に
『<a href="
http://aaa.com/ ">あああ</a>』と『<a href="
http://iii.com/ ">いいい</a>』
の2つを取り出せないのです。
拙いながらこのようなことを散々試したのですが……。
while( $list =~ /<a\s.*href="{1}?.*"{1}?.*>{1}?.*<\/a>{1}?/g )
{
print $&;
}
どなたか、助言していただけませんでしょうか。
433 :
432 :03/05/10 18:09 ID:???
自動リンクでなんかアホなことになってしまった。すみません……。
根本的なセンスが感じられないな
>>432 マイナス25点ってとこだな。なぜマイナスかと言うと、使うと損するくらい
まともに処理できてないからな。
まア、80点以上が出たらわたしのほうから正解を書くとしよう。
確かにセンスなさげだ
>>432 String#scan 使うとめっちゃ簡単に書けるよ。
>>437 Ruby 厨 キタ━━━━━━(゚∀゚)━━━━━━ !!!!!
>>437 やってることは同じだし、正規表現を使わないといけない所も同じ。めっちゃって言うほど簡単になるか?
これでええやん。堕落かもしれないけど。 HTML::LinkExtor->new( sub { my ($tag, %attr) = @_; push @links, values %attr; } )->parse(\$list); print "$_\n" foreach @links;
正規表現版は、とりあえず、、 print "$1,$2\n" while $list =~ m#<a href="([^"]+)">([^<]*)</a>#ig; これで妥協して。
href=''の場合もあるとか言いたいけど、我慢。
<a hoge='hoge href="
http:// "' href = '
http:// '><!-- hogehoge </a> -->hogehoge</a>の場合も…略
444 :
435 :03/05/11 01:12 ID:???
>441氏(神)のやつを参考にしたところ、うまくいった模様です。 name="" id="" class="" target="" 等が入った場合にも対応できたので、 とりあえずこれで良しとします。ありがとうございました。>434-444
446 :
405 :03/05/11 10:38 ID:QXPmJshp
ケツの</a>みてないけど、
m#<a.+?\s*href\s*=.+?\s*>#ig
あたりでどう?
<a name="" target="" href="
http://hoge ">
ってケースもある。
447 :
435 :03/05/11 11:05 ID:???
http_regx使っていいの〜?
449 :
nobodyさん :03/05/11 14:25 ID:QXPmJshp
open FILE, $file or die $!; read(FILE, $doc, -s FILE); while( $doc =~ m|<a.*?/a>|isg ){ my $temp = $MATCH; $temp =~ s/\n//g; print $temp,"\n"; } close FILE;
451 :
435 :03/05/11 16:12 ID:???
>>450 <applet><a href="hoge">abc</a>
<address><a href="hoge">abc</a>
<area><a href="hoge">abc</a>
あらゆる可能性も考慮しないと・・・30点
{ my @tag = $_ =~ m/<a([^>]).>/g; @uri = map{ m/($http_regx)/; $1; } @tag; } $http_regxは自分で調べること
>>452 訂正
{
my @tag = $data =~ m/<a([^>].)>/g;
@uri = map{ m/($http_regx)/; $1; } @tag;
}
<a [^>]*href=("[^"]+:[^"]+"|'[^']+:[^']+')[^>]*?>
455 :
435 :03/05/11 17:28 ID:???
457 :
435 :03/05/11 17:56 ID:???
>>456 <a name="hoge"><a href="hoge">abc</a>
もうひといき
458 :
456 :03/05/11 18:01 ID:???
>>457 ハァ?<a> はネストしちゃいけないわけですが何か?
>>458 432> ニュースサイトからアンカータグの部分だけを取得してくる
だから、念には念を入れておくってことで。
460 :
435 :03/05/11 18:07 ID:???
一応IE6のパーサーで95点だから、その辺よろしく。
461 :
456 :03/05/11 18:10 ID:???
>>459 その「念」てなんだよ。点数出すからには採点基準を示せよな。
parse 対象となる HTML の DTD も示せ。BNF でも構わん。
それができないのならこんなの不毛なだけだ。
じゃ、コレで如何だよ my @list = $data =~ /<a(?:[^>]+)?>/g; @uri = map{ $_=~ /href="?($http_regex)"?/; $1; } grep{/href="?($http_regex)"?/} @list;
463 :
459 :03/05/11 18:17 ID:???
>>461 ごめん、俺は435じゃない。
ネストしないんだからアレでイイと思うんだけど、
ニュースサイトがvalidなHTMLを書いていることは少ないから
「年」って行っただけぽ。
464 :
435 :03/05/11 18:21 ID:???
じゃあ、そろそろ80点以上の例でも示しておこう。 s/<!--.*-->//gs; # 前処理 @gets= $_=~ m!<A\s[^>]*?\bhref=.+?</A>!gsi; どうだ、、、これで確実に「ゲッツ!」しろYO!
>>464 URI以降も含むんでねーのかそれ・・・
466 :
435 :03/05/11 18:29 ID:???
>>465 >>432 嫁
s/<COMMENT>.*</COMMENT>//gs;
s/<!--.*-->//gs;
@gets= m!<A\s[^>]*?\bhref\s*=.+?</A>!gsi;
こんなのがもっと堅実かもな
467 :
435 :03/05/11 18:30 ID:???
間違った。。。iオプションがなくてはな s/<COMMENT>.*</COMMENT>//gsi;
468 :
435 :03/05/11 18:36 ID:???
まだ間違ってるな s!<COMMENT>.*</COMMENT>!!gsi; まったくつくづくだな
469 :
456 :03/05/11 18:44 ID:???
適当にうやむやにごまかそうとしてんじゃねえよ。とっとと「採点基準」を示せよ。
あぼーん
471 :
435 :03/05/11 18:51 ID:???
>>469 だから、<a name="hoge"></a>
とか
<!--<a href="hoge">--><a href="hoge">abc</a>
とかも考慮すると
>>456 は68点だな。
採点基準は漏れの直感だ
ほれ・・・ s/<!--(?:(?!-->).)*-->//ig; s/<COMMENT>(?:(?!<\/COMMENT>).)*<\/COMMENT>//gsi; @gets = m/<a[^>]+href=[^>]*>(?:(?!<\/a>).)*<\/a>/gsi;
473 :
435 :03/05/11 18:57 ID:???
なんや・・・ 結局イチャモンつけたいだけか・・・
475 :
435 :03/05/11 19:01 ID:???
っていうか、普通に <area href="url">ってタグあるの知ってる?
476 :
456 :03/05/11 19:03 ID:???
> 採点基準は漏れの直感だ お前、どっか逝け。
@gets = m/<a\s[^>]*href=[^>]*>(?:(?!<\/a>).)*<\/a>/gsi; じゃ、これでいいんでは?
478 :
435 :03/05/11 19:05 ID:???
>>477 だいぶいい感じだな。できれば最短マッチのほうがシンプルで処理も速いが
479 :
435 :03/05/11 19:08 ID:???
>>476 それじゃ進歩しないぞ。ここは道場だからな。ビシビシいくぞ!
馴れ合いスレじゃないからな。
もちろん漏れが書いたのもまだ不完全なのかも知れん。つっこみどころが
あればつっこんでもっといいものを出せばいいんだ。
あぼーん
481 :
456 :03/05/11 19:14 ID:???
>>479 じゃあ意味の無い点数なんて付けるな。
第一、処理対象となる HTML がどんな仕様なのか前提があいまいで、
あとからコレはダメだアレはダメだなんてのは、
単にいちゃもん付けたいだけとしか思えん。
だったら最初から parse 対象 HTML を全て提示しとけ。
482 :
435 :03/05/11 19:21 ID:???
>>481 いちいち見ず知らずの漏れが付けた点数に反応してどうするよ。
おかしいと思えば無視しろよ。
HTMLの仕様は決まってるだろ。今まで書いたことがいちゃもんだといわれ
ても、漏れがやってるプログラミングの世界ではあらゆる状況を考慮しないと
とんでもないバグになってしまうから、まア職業病だと思ってくれ。
483 :
456 :03/05/11 19:28 ID:???
>>482 > HTMLの仕様は決まってるだろ。
だから漏れが <a> はネストしないって言ったら、
>>457 と言う。
だったらお前の脳内HTML仕様を提示しろと言ってるんだYO!
とんだ職業病だな。
484 :
435 :03/05/11 19:33 ID:???
>>472 だから、わざと冗長な正規表現をかいただけのはなしだが・・・
^^^^^^
手前ルールでやられりゃ、腹も立つやろうなぁ・・・
あぼーん
すげー!変な奴キター!
>>487 486みたいな香具師は2chでは普通ですが、何か。
「詳説 正規表現」の第二版が今月下旬に出るみたいだね。
492 :
nobodyさん :03/05/12 10:28 ID:85k2ng51
前処理でコメントタグ取るなら、 ここまでやるってのはどう? /<(?:!(?:--[\s\S]*?--\s*)*(>)\s*|(?:script|style|SCRIPT|STYLE)[\s\S]*?<\/(?:script|style|SCRIPT|STYLE)>)/isg;
>>492 iつけるんなら、
/<(?:!(?:--[\s\S]*?--\s*)*(>)\s*|(?:script|style)[\s\S]*?<\/(?:script|style)>)/isg;
これでいいんでない?
[\s\S] って .でいいんちゃうかな?
494 :
nobodyさん :03/05/12 10:53 ID:85k2ng51
>>493 そうだね、指摘サンクスコ(・∀・)
漏れのソース、i付いてなかった(;´Д`)
495 :
nobodyさん :03/05/12 10:54 ID:85k2ng51
とりあえず、コメント削除は、
>>493 の指摘で完成する物で、かなり逝けると思われ。
ありとあらゆるサイトのコメント入りHTML食わせてみたけど、
まず間違いなく削除してくれる。
100%ではないかもしれないけど。
あぼーん
サイトによってコメントの定義が違うからな(皮肉
498 :
nobodyさん :03/05/19 22:15 ID:pDSpAcPJ
ファイル名だけを変数に取り込む時にフルパスからファイル名だけを取り出す 正規表現はどう書けばいいのでしょうか。 たとえば下のフルパスからhttpd.confだけを取り出すような場合です。 C:\Program Files\Apache Group\Apache\conf\httpd.conf
あぼーん
>>498 \\([^\\+])$
(\ \以外 末尾)
あぼーん
>>500 perlなのですがエラーになりました。
-----test.pl------
my $path = $0;
$path =~ \\([^\\+])$;
print "\$path :\n";
print "$path\n";
----------------
>>502 あたりまえだろう
$path =~ /\\([^\\+])$/;
>>498 $a='C:\Program Files\Apache Group\Apache\conf\httpd.conf';
($_)=$a=~ /^.+\\(.+)$/;
print;
>>503 すいません。
改めて試しましたがファイル名test.pが取得できません。
-----test.pl------
my $path = $0;
print "$path\n";
$path =~ /\\([^\\+])$/;
print "\$path :\n";
print "$path\n";
----------------
506 :
500 :03/05/19 23:33 ID:???
すんません。typoです。
× \\([^\\+])$
○ \\([^\\]+)$
>>505 typoに関係なくそのスクリプトは間違っている。
もう一回本読め。
>>504 さっそく試してみました。
しかしフルパスが入ります。
環境は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";
----------------
508 :
504 :03/05/19 23:45 ID:???
>>507 資源の無駄だからもう書き込むな
スレが汚れる
>>508 すいません。
>>504 の正規表現でhttpd.confが拾えました。
あとはスクリプトの間違いを修正してみます。
頭の固い香具師だな
>>511 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;
----------------
編集途中のソースが残っていたのでもう無視して下さい。
フルパスで入力した場合は下のような値が入るので問題ないのですが $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だけを抜け出せないでしょうか。 スレ汚しで申し訳ないです。
#---------------test.pl---------------- 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; #--------------------------------------
$path =~ /([^\\]\+)$/ print "$1"; っていうか use File::Basename; 使え。
517 :
515 :03/05/20 12:28 ID:???
>>516 ありがとうございます。
皆さんのおかげで完成しました。
use File::Basename; も調べてみます。
518 :
515 :03/05/20 12:30 ID:???
#---------------test.pl---------------- 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"; #--------------------------------------
519 :
515 :03/05/20 12:33 ID:???
#---------------test.pl---------------- $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"; #-------------------------------------- スレ汚しに付き合って頂いて感謝でした。
520 :
nobodyさん :03/05/20 12:47 ID:ridin1oO
>>515 use File::Basename;
$path = 'C:\Program Files\Apache Group\Apache\conf\httpd.conf';
$file = basename($path);
print $file;
あぼーん
522 :
山崎渉 :03/05/22 01:59 ID:???
━―━―━―━―━―━―━―━―━[JR山崎駅(^^)]━―━―━―━―━―━―━―━―━―
山崎のせいで落ちるところだったわ
あぼーん
525 :
山崎渉 :03/05/28 17:06 ID:???
∧_∧ ピュ.ー ( ^^ ) <これからも僕を応援して下さいね(^^)。 =〔~∪ ̄ ̄〕 = ◎――◎ 山崎渉
526 :
nobodyさん :03/06/06 19:09 ID: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で返ってきます。。
?そのもにをマッチさせるにはどうすれば良いのでしょうか。
あぼーん
>>526 PHP だよね?漏れのところ (PHP 4.3.1) ではどっちも true が返るよ?
530 :
526 :03/06/09 10:45 ID:???
>>528 はい。PHPです。どちらもtrueが返るようになりました。
原因は、「if ( ereg("^[a-z,〜〜〜」を通す前にさらにチェックしていてそこで引っかかっていました。
正規表現とは関係なくてすいませんでした。
>>529 そこはperlだったのですが参考になりそうなページでした。ありがとうございました。
531 :
yoko :03/06/10 13:46 ID:QvCU0It/
秀丸でやろうとしているんですが、無理でしょうか? 以下のような形式のテキスト ファイルを扱っています。生徒から備考までを 1 ブロックとして、生徒番号 800 までのブロックがあります。本当は XML か CSV で管理するべきだと思うので近いうちに変換する予定です。 生徒: 1名前: 田中得意科目: 数学苦手科目: 古文備考: 2 学期より編入 生徒: 2名前: 山田得意科目: 国語苦手科目: 世界史備考: 模試未受験 生徒: 3 .. 今正規表現をつかって各データの手直しをしているのですが、とても簡単なと ころでつまづいています。 "生徒: 2" から "生徒: 2." という具合に、生徒行の数字の後ろにピリオドを つけたいのですが、どのような表記で置換処理をしていいのかわかりません。 "生徒: [[0-9]+|[02-9]]" で "生徒:" とその数字部分を検索でヒットするこ とはできるのですが、これを "生徒: [[0-9]+|[02-9]]." で置換しても "生徒: [[0-9]+|[02-9]]." に入れ替わるだけです。大きな勘違いをしているとは思 うのですが…正規表現の資料をみてもここから先に進むことができません。 すごくつまらない質問だとは思いますが、どなたかみていただけないでしょう か。
↑のテキストの部分おかしいですね。 書き直します。 生徒: 1 名前: 田中 得意科目: 数学 苦手科目: 古文 備考: 2 学期より編入 生徒: 2 名前: 山田 得意科目: 国語 苦手科目: 世界史 備考: 模試未受験 生徒: 3 ..
533 :
nobodyさん :03/06/10 13:56 ID:wps94Nox
>>531-532 おそらく秀丸のヘルプ嫁。かと。
正規表現の互換があるかどうか判らないが Perl だと、
s/(生徒: \d?\d)/$1\./g; 等。
>>533 チョソなのでニポンコよくわからないてす。
ニポンコむつかしにだ。
>531-532 ヘルプ開いて「タグ付き正規表現」というのを読めば幸せになれるかと
あ、キーは長い順に sort しなきゃダメかな。まいっか。
538 :
yoko :03/06/11 13:19 ID:FQ/QXZet
>>535 ありがとうできました!
チュパ (←フェラ)
542 :
nobodyさん :03/06/11 16:25 ID: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ファイルがおかしく なってしまっているのだと思われます。 もし宜しければ、教えてください。 すみませんが宜しくお願いいたします。
>>542 ヒント
$reg "s?https?:\/\/[-_.!~*'()a-zA-Z0-9;\/?:\@&=+\$,%#]";
while ( $txt =~ /$reg/g ) {
.
.
.
}
>>544 貴重なヒント感謝です。
しかし、厨房な私にはどうも理解できていないみたいです。
せっかくのヒントをいただきながら、本当に申し訳ありません。
547 :
nobodyさん :03/06/13 23:26 ID:sIi8OqiB
(\$|\%|\@)[^a-zA-Z]*? ↑このような正規表現の場合、これは 頭が"$"or"%"or"@"のいずれかから始まって 続いて、アルファベット以外が来る場合。だと思うのですが? 最後の*?はどういう意味でしょうか? *は0字以上、?は0か1だと覚えているのですが・・・
548 :
547 :03/06/13 23:27 ID:???
あ、ちなみにこれは秀丸エディタで 強調表示するためのものです(perl版)。
最短マッチは、その後にパターン指定がなければ使う意味がなきにけり
秀丸の正規表現に最短マッチはなかりけり。
551 :
547 :03/06/14 00:29 ID:???
最短マッチで検索してみました。 .*hogeに対して .*?hoge は、検索対象に対してhogeがヒットした一番最初の部分を 取るという事ですね! 例えば hogeXXhogeXXhoge の場合後者は最初のhogeでマッチ。前者は 3つめのhogeでマッチ! という事ですね!?
552 :
547 :03/06/14 00:32 ID:???
553 :
nobodyさん :03/06/15 21:39 ID:mUOjbxbY
test.htmlの中身が <!-- $aaa --> <!-- $bbb --> と記入されていて、cgi本体で $aaa = 'aaaの中身'; $bbb = 'bbbの中身'; と定義されている時 test.datをopenし while(<FH>){ 正規表現で$aaaなどの頭に$がついてるのを定義されている変数と置き換える } とするにはどうすれば良いでしょうか?
ない知恵を絞って考えてみましたが、どんなもんでしょう。 とりあえず、下のスクリプトで動くには動きますが。。。 $aaa = "あ"; $bbb = "い"; $ret = "\$aaa\$bbbb"; $Hash{'\$aaa'} = $aaa; $Hash{'\$bbb'} = $bbb; while(($key,$value)=each %Hash){ $ret =~ s/$key/$value/; } print "$ret\n"; #実行すると「あいb」と表示される。
>>553 意味わからん
ファイルがどうこうなんてスレ違いだ
正規表現で何をどう置き換えたいのかだけはっきりせよ
556 :
553 :03/06/15 23:18 ID:/un8khu+
>>554 おぉ〜どうもありがとう。
参考にさせてもらいます。
>>555 出し惜しみせずに書いたつもりでしたが・・・シンプルに書き直します↓
$bbb = 111;
$ccc = 222;
$aaa = 'XXX $bbb XXX $ccc XXX';
print なにか
出力結果
XXX 111 XXX $ccc XXX
というのをやりたいです。また$aaa に含まれる変数名 例$bbbなど
は1つだったり3つだったりとするので一般化したいです。
>>556 正規表現というより、どっちかといえばperlのコーディングのほうがメインだな。
他でやってくれ。
>>556 #!/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);
559 :
553 :03/06/15 23:49 ID:/un8khu+
>>557 う・・・そうでしたか。。スマソです。
>>558 おぉおぉ〜どうもありがとうございます。
勉強になりました。
多謝!!
561 :
558 :03/06/16 01:26 ID:???
なぜ?
まぁ、いいじゃねぇか。たまには…。 マタ〜リしすぎだしこのスレ
565 :
nobodyさん :03/06/19 09:48 ID:zhmAwMLg
すいません、ちょっと質問なんですが 今現在、<a name="1000</a>になってるソースを <a name="1000">1000</a>に変更したいのですが どうすればいいんでしょうか? ちなみに「1000」の部分は「1」から「1000」までの連番で <a name="1">1</a> から <a name="1000">1000</a> のようにしたいんです。 ヘンテコな説明ですみません。
>>565 perlの場合はこんな感じかな。(変換前のHTMLが間違ってるけどそれでOKという前提で)
s/(<a name=")(\d+)(<\/a>)/$1$2">$2$3/;
568 :
nobodyさん :03/06/19 10:56 ID:bERWsbmj
正気表現とオートマトンはどのような関係にあるんですか?
>>567 それでいいんじゃないの?何かおかしい?
572 :
565 :03/06/19 21:37 ID:???
>>566 レス遅れてすみません凹
早速、やってみたんですが
思ったように出来ませんでした(>_<)
それと申し遅れましたが、自分
「speeeeeed」というソフト使ってるんですが
このソフトで正規表現を使った置き換えが
出来たらうれしいんです。
わがまま言ってすみません。。
speeeeeed じゃなくて speeeeed だろ。 BREGEXP.DLL導入すれば正規表現使えるって書いてあるから導入すればいいんじゃないのん? やりかたはHELPに書いてあった。
574 :
565 :03/06/19 21:58 ID:???
>>573 すいません「e」が一個多かったですね^^;
はい、BREGEXP.DLLは導入済みなんですが
正規表現の構文?がわからないので・・・(涙
575 :
515 :03/06/19 22:15 ID:???
>>574 勉強すればわかるようになる。
とりあえず自分で調べてみな。
ホスト名にマッチする正規表現は知りませんか?
>>576 ホスト名には決まった書式はないので無理
578 :
576 :03/06/20 00:11 ID:???
ども。576です。 取り敢えず、簡易ながら \da-zA-Z\-]+(?:\.[\da-zA-Z\-]+)+ で落ち着いきたく思うのですが、 ENVの中のHTTP_FROMとかHTTP_SP_HOST内で使うには問題ありませんでしょうかね‥?
579 :
576 :03/06/20 00:13 ID:???
スミマセン。 [\da-zA-Z\-](?:\.[\da-zA-Z\-])+ デス。
HTTP_FROMやHTTP_SP_HOSTにホスト名が入ることはないのに?
マジで? でも、HTTP_SP_HOSTはHOSTと書いてある時点で入る可能性は否定出来ないのでは?
入るよ
痛いよ
584 :
576 :03/06/20 01:28 ID:???
今度はe-mailにはマッチしないようにしようとしたのですが、 [^@]\b([\da-zA-Z\-]+(?:\.[\da-zA-Z\-]+)+)\b[^@] これでは対象が先頭から始まる場合、もしくは末尾で終わる場合にマッチしません‥ ダサイ回避策として、検索する文字列に予め先頭と末尾にスペースを入れるという方法がありますが、 正規表現のみで解決する良い手段はないでしょうか???
HTTP_FROMやHTTP_SP_HOST内で使うっていうなら他のものが 入ることはないでしょ。 何が含まれているかわからない中からホストを完璧にマッチさせる 正規表現は不可能だし、メールアドレスもまあまあマッチすれば いいなら、過去ログであったはず。
586 :
576 :03/06/20 01:44 ID:???
ども。ども。 なんとか自己解決しました。 一応どんなものになったかカキコしておきますね。 (?:^|[^@]\b)([\da-zA-Z\-]+(?:\.[\da-zA-Z\-]+)+)(?:\b[^@]|$)
よくわからん。 ホスト名にマッチするようにしたら、 メールアドレスにマッチするわけないと思うのだが・・・
588 :
587 :03/06/20 01:53 ID:???
あ、いや、そんなことないか。勘違いだ。スマソ
589 :
565 :03/06/20 07:31 ID:???
>>575 レスありがとうございます。
そうですね!
とりあえず、いろんなサイト見て勉強してみます!
あぼーん
PHPでリンクの置き換えに困ってます。例えば
<a href="../test/read.cgi/mysv/1044358074/115" target="_blank">
>>115 </a>
で、URL部../test/read.cgi/mysv/1044358074/115と >> より後の数字を不特定で
マッチさせたいのですがどう表記すればよいでしょうか。お願いします。
>>592 <a href="([^"]+?)" target="_blank">>>(\d{1,3})</a>
みたいな?
>>593 "は\"に変えましたけどそれでもエラーなります
595 :
nobodyさん :03/06/21 11:57 ID:NfKIfdiT
csvの分解ってPerlの正規表現一発でできますか? aaa,"bbb,ccc",ddd とかも正しく分解できる奴
596 :
595 :03/06/21 12:00 ID:???
Perlメモにありましたね 失礼
597 :
nobodyさん :03/06/22 03:04 ID:pHsSEvkK
PHPの質問スレッドにてこちらのほうがいいと言われましたんでこのスレにきました
ページ内からリンクとリンクを張られた文字を全て取得したいのです
このスレの
>>432 に似てるのですが、張られた文字も取得したいのです
例えば、<a href="URL">文字列</a>だったら「URL」「文字列」の両方です
自分でもいろいろやってみたのですが、上の例のような形のモノしか取得できません
もう少し、柔軟に取得できるものがいいのですが
preg_match_all ("|<a href=\"([^>]+)\">([^<]+)</a>|U", $contents, $out, PREG_SET_ORDER);
私にはこれが限界です、よろしくお願いします
PHPじゃないんだが。。。 <a\s[^>]*?href="((https?|ftp):\/\/[-!\#\$%&'()*+,.\/:;=?\@~\w]+)"[^>]*?>([\s\S]+?)<\/a>
599 :
597 :03/06/22 04:51 ID:???
>>599 テストしながら自分で改良しろよ…ヤレヤレ…
>>599 HTMLの仕様から考えると「考えなくて良い」ものもあるが
それにも対応すると?
>>599 そういうのは柔軟じゃなく薄弱と言うんだ
// /* */ からなるコメント文を消すには、どう書けばいいんですか?
604 :
597 :03/06/22 16:22 ID:???
この道場冷たいなあw ちょっとくらい稽古つけてくださいよ こんな感じで頑張ってはいるんですよ preg_match_all ("/<\s*a\s[^>]*?href\s*=\s*(?:\"|\'|)([-!\#\$%&()*+,.\/:;=?\@~\w]+)(?:\"|\'|)[^>]*?>([\s\S]+?)<\/a>/i", $contents, $out, PREG_SET_ORDER);
>>604 「aをスペースで囲む」ってのに対応するのはナンセンスな気がするな。
つーか、正規表現一つで処理せなあかんの?
"#<a[^>]*\shref\s*=\s*(?:\"([^\"]+)\"|'([^']+)'|(\S+))[^>]*>(.+?)</a>#i"
607 :
603 :03/06/22 18:24 ID:???
<a href=""> と決め打ちするのはどうして? <a alt="" href=""> はありえないことが確定してるの?
<a>にaltはないが、titleとかclassなんかはありえるな。
[<\s]+a [^>]*href[\s=]+(?:"([^"]+)"|'([^']+)'|([^\s>]+))[^>]*>(.+?)</a>
以後、この手は放置で。
駄目だこりゃぁ…
ここは別に最初から最後まで手取り足取り教える為のスレッドじゃないんだよ
>>598 で充分過ぎるほどヒント出てるんだから、自分で「正規表現」を
習得しつつコードを書こうという気は起きないのかい?
613 :
597 :03/06/23 02:57 ID:???
どうせ正規表現をつかって作るのなら柔軟なものを、と思っています。
今まで見てきたHTMLで「文法はおかしいけれどありそうなもの」
「このくらいならありえるかな」ってのを
>>599 にいくつかピックアップしてみました
ちょっとありえないものもあるかもしれません
万能(に近い)リンク抽出正規表現ってのをつくってみませんか?
>>599 のリストに、他にもありえそうなものを追加して……
出来たら教えてくれ。 とりあえずそろそろウザイ。
615 :
597 :03/06/23 03:11 ID:???
>>614 スマソ
とりあえず
>>599 から
>>605 にあるように「aをスペースで囲む」を無くして
>>610 にも対応したもの
#<a[^>]*\shref\s*=\s*(?:\"([^\"\s]+)\"|'([^'\s]+)'|([^>\s]+))[^>]*>(.+?)</a>#i
なんで今さらリンクの正規表現なんか作らにゃならんのだ・・・
>>615 </a>で閉じられてない奴とか<,>の前後の空白とか
"(ダブルクォート)じゃなくて'(シングルクォート)だったり
618 :
605 :03/06/23 05:02 ID:???
>>615 ・hrefの前に>があったら失敗するな(ex. title="<1>")
・行に2つ以上anchorがあったら1つめのマッチングで
最後の</a>までマッチしそうだ
まあがんがれ
>>619 ああ、.+?って最小マッチってやつっすか。。。スマソ
>>615 >・・・(.+?)</a>#
(.+?)の部分に<!-- </a> -->が入ってたら?
正規表現だけで完璧なものを作ろうと思ってもむるなんじゃない?
おれもむるだと思う。
小魚が取れればいい網をクジラやプランクトンまで対応しようと無駄なコストを
625 :
597 :03/06/23 18:57 ID:???
>>617 </a>で閉じられてないってのはどういうことっすか?
「< /a >」だとか「</a <!-- /ここまで -->>」とかですか?
リンクを正規表現で抽出する前に、コメントを取り除いたほうがいいですよね
それとも男なら一度にやるべきでしょうか……
PHPなら「アンカータグ以外を取り除く」なんて簡単に出来ちゃいますし
626 :
597 :03/06/23 19:29 ID:???
< /a>と title="<aaa>" はブラウザがうまく表示できないみたいなんで(IE6のみ確認)
対応しなくてもいいかな、と思いつつ一応やってみたら
<a title="<aaa>" href="
http://www.aaa.aaa ">他要素の中に<>がある</a>
<a href="
http://www.aaa.aaa "><!-- リンク </a> -->文字列にコメントがある</a>
のようなものも上の正規表現で問題なく抽出できました、なんでだろう?w
627 :
597 :03/06/23 19:32 ID:???
上は「< /a>」ではなく「< /a >」の誤りですスマソ 「< /a>」はIE6で正常にリンクされてます。 仕様よりもIEを基準にするな!って怒らないでくださいね
世の中のふつーのブラウザは、 <a> が明らかに閉じてるべきとこまではリンクと見做してくれてるんでしょ。 アフォな HTML 作成者を救うために。 ところで、パレートの法則って知ってる? つーか、アンカータグの抽出なんてこのスレでも思いっきり概出やろ。
>>628 >アンカータグの抽出なんてこのスレでも思いっきり概出やろ。
だけどこの質問者は「万能な」ものを求めてる。
HTMLがいくら間違ってても抽出したいと思ってるわけだ。
#その時点でオhルんだがな。
おぃおぃ、もう夏厨の季節か?(藁
632 :
nobodyさん :03/06/24 00:17 ID:VrEbx1+X
正規表現を使って、あるテキストの先頭から10行目を取得する書き方が、 解りません…どたか教えて下さい。どうか、お願いします。 JDK1.4.1の正規表現クラスを使ってます。
633 :
nobodyさん :03/06/24 00:20 ID:VrEbx1+X
↑補足です。すいません、Jakarta-OROでもいいっす(Perl5ね)
またくれくれか。もううんざり。
splitで取得してやったぜ! $line10 = (split(/\n/, $text))[9];
>>632 それのどこが「正規表現」なのかと(ry
なんでもかんでも正規表現使えばいいと思ったら大間違いなわけだが。 /\A((?:.*\n){0,10})/m
>>640 べんきょ足りんですた。逝って来マウス。
>>626 title="<aaa>"は正当だよ。
title="<aaa>"と書かれていたときはtitle="<aaa>"と
解釈しなくてはならないが、title="<aaa>"と書いてはいけないという
意味ではない。&を&と書かないと誤解釈する可能性が
あるという問題とごっちゃにされてるんだろうな。
謎HTMLでも抽出したいと思うのは勝手だが それならせめてどういう謎HTMLも許容したいのか 仕様を明確にしてくれないと作りようがない。
つまりHTMLの仕様を無視した偽HTMLの仕様を書け、ということですな。
今、
>>643 が良いこと言った。
というわけで、以後、要求仕様を明確にしてないお題は放置で。
>>646 名前が597じゃなくnobodyさんになってるぞ?
>642 (゚Д゚≡゚Д゚)エッナニナニ?本当か?
>できれば下のに対応できるくらい柔軟なものってできませんか?
とか
>万能(に近い)リンク抽出正規表現ってのをつくってみませんか?
みたいな他力本願なレスは激しく萎える事に
>>597 は気づいているのかなー?
651 :
597 :03/06/24 18:45 ID:???
>>650 「今更リンクの抽出かよ……」なんて萎える人もいるでしょうが
まあ暇だし付き合ってやるか、という人もいるかなと思ってはじめました
他力本願ですが、道場ということで甘えてみましたw
>>643-645 仕様といっても難しいので、ありえそうなものを考えると
>>599 >>610 >>626 あたりになるのかなって感じです
今出てるものでは
>>615 ですべて対応できてるはずです
つーか実際に間違ってるHTMLって多いですよね
リンクを抽出することを考えたときに
HTML書いた人に直すようにメールするか
対応した正規表現にするかどっちが早いかって話です
死ね。ヴォケ
>>651 これ以上は別スレ立ててやってくれ。
HTML lintのページは参考にならんか?
>>651 道場で鍛えるのは自分自身だよ。
鍛えている人を眺めているだけでは上達しない。
とりあえず邪魔。
すみません、ちょっと教えて頂きたいんですけど、 $_ = "w439soz980i505"; @a = /^(?:(\w)(\d{3}|[ao]))+$/; 上のような正規表現で、括弧に入った文字列を全て@aに入れたいんですが、 実際にはループの最後の"i"と"505"だけしか入りません。 全てを@aに入れる方法はあるんでしょうか?
>>655 @a = /((\w)(\d{3}|[ao]))+?/g;
@aの中身 w439 w 439 so s o z980 z 980 i505 i 505
Perl5の正規表現で $fn =~ s/\W/\0/g; $fn =~ s/\0/\|/g; は、一体どういう処理をしているのか判る方いませんでしょうか
>>657 単語構成文字(_a-zA-Z0-9)以外の文字が | に置き換わる。
659 :
655 :03/06/28 00:06 ID:???
>>656 レスが遅れてすみません。
どうもありがとうございました。参考になりました。
なんで $fn =~ s/\W/\|/g; じゃないんだろう
\Wがなくて\0だけあったときでも置き換えられるように
>>658 うーんなるほど。\|を変に難しく考えてました。
回答ありがとうございます。
>>657 あ、ごめん。\0 って null 文字の事?
\0=\000
\0=\000=\x00
含まれないだろ。多分…
>>667 多分じゃねーよ。ちゃんと調べろよ。
print "MATCHED\n" if ("[\0]" =~ /^\W+$/);
めんどくせ ヽ(´Д`;)ノ
保守
>>662 Perlの場合記号に\付けてもメタ文字にならない
このスレはPerlとは限らんが
2143184 といった数字の羅列を 2,143,184という風に3桁ごとにカンマを入れるにはどうしたらいいですか? おしりからマッチさせることができれば簡単なんですが。 この桁数だと, /^([0-9]{,2})([0-9]{3})([0-9]{3})$/ を \\1\,\\2\\3 としたらできるんですが,もっときれいにできる方法を教えてください
673 :
672 :03/07/10 13:50 ID:qpJaCER1
× \\1\,\\2\\3 ○ \\1\,\\2,\\3
あぼーん
__∧_∧_ |( ^^ )| <寝るぽ(^^) |\⌒⌒⌒\ \ |⌒⌒⌒~| 山崎渉 ~ ̄ ̄ ̄ ̄
678 :
nobodyさん :03/07/15 22:27 ID:bkNlTgQn
Perlの掲示板の書き込みで、>が先頭に来た書き込みを<blockquote>で囲むため、 $str =~ s/(^|<br>)>.*?(?=<br>|$)/<blockquote>$&<\/blockquote>/g; $srt =~ s/<\/blockquote><blockquote>//g; このような正規表現を書きました。 でもなんかスマートではないので、 上記二つのをまとめて表すにはどうすればいいのでしょうか?
$line =~ s/^(..)(...)//; 正規表現してください,お願いします。
先頭って何だ? つか何でblockquote?
>>681 中途送信鬱。
>>678 行頭の「>」で加工したいのなら、一旦行ごとに配列にいれてから加工してみてはどうぢゃろ?
$str =~ s/(^|<br>)((?:>.*?(?:<br>|$))+)/$1<blockquote>$2<\/blockquote>/g;
684 :
678 :03/07/16 17:05 ID:???
>>683 ありがとうございます。完全に出来ました。
それに、マッチ変数も使っていないので一挙両得です。
本当にありがとうございます。
perl質問箱で質問したらココに行って来いって言われたので来ました 掲示板なんかで、引用符「>」「>」から先の文字の色を変えるにはどうしたらいいですか?
>>685 ちょっと前のレスをみりゃぁ分かる。
色程度ならCSSをつかえばいいしな
687 :
679 :03/07/17 00:29 ID:???
教えてもらえないでしょうか?
689 :
679 :03/07/17 01:28 ID:???
すみません・・・CGIの抜き出しなんですけど、 $line =~ s/^(..)(...)//;を、PHPで使いたいんでどのように正規表現したら、 いいでしょうかということで・・・
>>689 CGI とか正規表現よりも、日本語の勉強したほうがいいぞ。
>>689 そのperlの文が何をしてるか分かってる?
perl互換の正規表現は preg_* で使えるから、PHPのマニュアルをよく読んでごらん。
夏厨&PHP厨らしい質問方法だな。質問内容も意味不明だがな(うひょげら
694 :
679 :03/07/17 17:32 ID:???
解決しました。^の意味解かってませんでした・・・
>>679 を見て誰が何を答えることができるのだろう。本気で教えてもらおうとしてたんだろうか。
>>695 釣りでしょ。釣果は芳しくなかったようだが。
697 :
nobodyさん :03/07/18 10:04 ID:qmPObEGp
やりたいこと
PHP4.2.3-9でタグの外側の文字のみ置換したい
<?
$word = "<a href=\"
http://hoge.hoge/bb/\ ">link Bb</a>";
echo "これを$word<br>\n";
$word2 = "<a href=\"
http://hoge.hoge/bb/\ ">link <b>B</b><b>b</b></a>";
echo "こうしたい$word2<br>\n";
$word = preg_replace("/((?:\G|>)[^<]*?)(b)/i","\\1<b>\\2</b>",$word,-1);
echo $word;
?>
実行結果は
<a href="
http://hoge.hoge/<b >b</b>b/">link <b>B</b>b</a>
になりました。
698 :
697 :03/07/18 10:04 ID:qmPObEGp
--- Perlで書くと ---
#!/usr/local/bin/perl
print "Content-type: text/html\n\n";
$word = "base bb<a href=\"
http://hoge.hoge/bb/\ ">link Bb</a>bg big";
print "これを$word<br>\n";
$word2 = "<B>b</B>ase <B>b</B><B>b</B><a href=\"
http://hoge.hoge/bb/\ ">link <B>B</B><B>b</B></a><B>b</B>g <B>b</B>ig";
print "こうしたい$word2<br>\n";
$word =~ s/((?:\G|>)[^<]*?)(b)/$1<B>$2<\/B>/ig;
print "$word";
実行結果は
<B>b</B>ase <B>b</B><B>b</B><a href=\"
http://hoge.hoge/bb/\ ">link <B>B</B><B>b</B></a><B>b</B>g <B>b</B>ig
で意図したとおりになりました。
PHPのpreg_replaceはPerl互換なのに、実行結果が異なるのでしょうか?
699 :
nobodyさん :03/07/18 13:23 ID:yTICzsYG
余裕で 700 GET ⊂(゚Д゚⊂⌒`つ≡≡≡(´⌒;;;≡≡≡
701 :
697 :03/07/18 17:49 ID:qmPObEGp
>>699 あれれ。そうなんですか。
PHPでどう書けばいいんだろう。
702 :
nobodyさん :03/07/18 22:35 ID:5012QaLa
>>701 $word = preg_replace("/((?:^|>)[^<]*?)(b)/i","\\1<b>\\2</b>",$word,-1);
703 :
703 ◆jhDfq/C6oU :03/07/21 06:22 ID:vOgKMI0a
置換についての質問なんですが、 $q1 =~ s/\b1\b/12番目/; $q1 =~ s/\b2\b/16番目/; [$q1]が[1]ならば『12番目』を、 [2]だったら『16番目』と置換えたいのですが、 [$q1]が[1]だった時、『12番目16番目』と置換えられてしまいます。 勘違いかもしれませんが、『\b』で境界をやってみても変わりません。 どのようにすると良いでしょうか? ご教授お願い致します。。。 p.s 条件分岐のほうがいいのでしょうか?
>>703 漏れのところでは動いているが。
$q1 = '0 1 11 12 2 21 22 3 4 5 9';
$q1 =~ s/\b1\b/12番目/;
$q1 =~ s/\b2\b/16番目/;
printf qq($q1\n);
出力
0 12番目 11 12 16番目 21 22 3 4 5 9
Perlで、 $a[0] = "HyperTextTransferProtocol = HTTP"; $a[1] = "UniversalResourceLocation = URL"; $a[2] = "DataBase = DB"; これらの=より前の部分を大文字にしてスペースで区切って HYPER TEXT TRANSFER PROTOCOL UNIVERSAL RESOURCE LOCATION DATA BASE と出力させたい。 どなたかご教授願います。
取り敢えず、こうヤルしかないかな… $a[0] =~ s/([a-z]+)/\1 /g; print $a[0] . "\n"; $a[0] =~ tr/a-z/A-Z/; print $a[0] . "\n";
707 :
706 :03/07/21 18:23 ID:???
リスト対象だっけ? foreach ( @a ) { s/([a-z]+)/\1 /g; tr/a-z/A-Z/; }
なるほど。ありがとうございました。
>>705 =の前後はsplitで切れるし、置換でもいける
で、大文字の前にスペースを入れてぜんぶおおもじにすりゃぁいいのの?
710 :
697 :03/07/22 10:45 ID:FAepGeTT
>>702 すごい! 動きました。
ありがとうございます。
>>710 そりゃ動くだろ。回答者は質問者以上に慎重にレスしてるんだよ。(とつぶやきたい)
712 :
697 :03/07/22 10:52 ID:FAepGeTT
と思ったのですが
$word = "base bb<a href=\"
http://hoge.hoge/bb/\ ">link Bb</a>bg big";
$word = preg_replace("/((?:^|>)[^<]*?)(b)/i","\\1<b>\\2</b>",$word,-1);
結果
<b>b</b>ase bb<a href="
http://hoge.hoge/bb/ ">link <b>B</b>b</a><b>b</b>g big
になりました。
一部置換されないみたいです。。
あぼーん
715 :
702 :03/07/22 15:04 ID:+ex6aWif
あぼーん
717 :
697 :03/07/22 15:36 ID:FAepGeTT
>>715 すごい!
ありがとうございます。
ちゃんと置換されてました!
718 :
nobodyさん :03/07/24 18:38 ID:9bbcZ2D/
http URL の正規表現についてですが、
Perlメモを見ると、長いバージョンと短いバージョンが以下のようにかかれてますが・・・
$http_URL_regex =
q{\b(?:https?|shttp)://(?:(?:[-_.!~*'()a-zA-Z0-9;:&=+$,]|%[0-9A-Fa-f} .
q{][0-9A-Fa-f])*@)?(?:(?:[a-zA-Z0-9](?:[-a-zA-Z0-9]*[a-zA-Z0-9])?\.)} .
q{*[a-zA-Z](?:[-a-zA-Z0-9]*[a-zA-Z0-9])?\.?|[0-9]+\.[0-9]+\.[0-9]+\.} .
q{[0-9]+)(?::[0-9]*)?(?:/(?:[-_.!~*'()a-zA-Z0-9:@&=+$,]|%[0-9A-Fa-f]} .
q{[0-9A-Fa-f])*(?:;(?:[-_.!~*'()a-zA-Z0-9:@&=+$,]|%[0-9A-Fa-f][0-9A-} .
q{Fa-f])*)*(?:/(?:[-_.!~*'()a-zA-Z0-9:@&=+$,]|%[0-9A-Fa-f][0-9A-Fa-f} .
q{])*(?:;(?:[-_.!~*'()a-zA-Z0-9:@&=+$,]|%[0-9A-Fa-f][0-9A-Fa-f])*)*)} .
q{*)?(?:\?(?:[-_.!~*'()a-zA-Z0-9;/?:@&=+$,]|%[0-9A-Fa-f][0-9A-Fa-f])} .
q{*)?(?:#(?:[-_.!~*'()a-zA-Z0-9;/?:@&=+$,]|%[0-9A-Fa-f][0-9A-Fa-f])*} .
q{)?};
s?https?://[-_.!~*'()a-zA-Z0-9;/?:@&=+$,%#]+
http:// or
https:// がないパターンの正規表現っていうのは、
上記から、
長いバージョンは、(?:https?|shttp):// をとりのぞいたもの、
短いバージョンは、s?https?:// をとりのぞいたもの、
っていう認識は、あってますか?
あぼーん
721 :
718 :03/07/24 23:48 ID:???
>>719 あれ?
指摘きぼんぬ。
少なくとも短いバージョンはこれであってると思ったんだけど。。。
>>721 それでいいけど、そうすると、一般的すぎるんじゃないかね?
s?https?://[-_.!~*'()a-zA-Z0-9;/?:@&=+$,%#]+ から s?https?:// を 取り除いて残るのは [-_.!~*'()a-zA-Z0-9;/?:@&=+$,%#]+ だよな? [ ] 内の文字が1文字以上ってことだ 1-1=2 (,,-_-) (~*~)ohhoho(-_-;) 1000Get!! いろいろマッチするけどいいのか? まあ使う場所によってはいいのかもしれないが
http URL って、 scheme, hostname, pathname の3つに分ける事できるから、 その辺考えれば解ると思うが…
726 :
nobodyさん :03/07/27 03:01 ID:2mIqT5H5
すいません、初歩的な質問させてください。 linuxのコマンドライン上で、カレントディレクトリ以下からabcま たはdefを含むファイル名を表示させたいのですが、 find|grep (abc|def)とかやってもだめなんです。どうすれば よいんでしょうか?
>>726 find |egrep "(abc|def)"
729 :
726 :03/07/27 09:52 ID:95lYaVNF
あぼーん
>>728 それはそれぞれの項目に入るよ。rfc 読めば?
732 :
732 :03/07/27 13:16 ID:dJWoBMBZ
置換についてです。 $a内の『7月27日』を『7/27』に換えたいんですが、 $data =~ s/7月27日/7/27/g; と、すると区切りのスラッシュがダブってしまいますよね。 こんなときの対処方法がご存知でしたら、 御教授お願い致します。
/7月27日/{7/27}
>>728 リンク先、どう見ても素人のページだろ。お前マサピコか?
正確な情報を得るにはまともなページ見て勉強しろよ。
736 :
732 :03/07/27 14:07 ID:dJWoBMBZ
レスありがとうございます。
>>732 逆スラッシュ入れてもエラーになりました(T.T)
>>734 それは無理かと…
737 :
732 :03/07/27 14:09 ID:dJWoBMBZ
>>736 エスケープする。
$data =~ s/7月27日/7\/27/g;
739 :
732 :03/07/27 15:07 ID:dJWoBMBZ
>>738 $data =~ s/7月27日/7/\27/g;
[\]位置が逆でした(汗
ありがとうございます。
もう一つ御教授頂きたいのですが、
$data =~ s/ソ/そ/g;
こちらの置換がエラーとなってしまいます。
解決方法はございますか?
>>739 うるせーよ!
聞いてばかりいないで試すなりググるなりしやがれ!
ソとか表とか見飽きたな。
>>739 Shift-JIS分からないくせにわざわざShift-JIS使うな。
―(0x815C) ソ(0x835C) Ы(0x845C) \(0x875C) 噂(0x895C) 浬(0x8A5C) 欺(0x8B5C) 圭(0x8C5C) 構(0x8D5C) 蚕(0x8E5C) 十(0x8F5C) 申(0x905C) 曾(0x915C) 箪(0x925C) 貼(0x935C) 能(0x945C) 表(0x955C) 暴(0x965C) 予(0x975C) 禄(0x985C) 兔(0x995C) 喀(0x9A5C) 媾(0x9B5C) 彌(0x9C5C) 拿(0x9D5C) 杤(0x9E5C) 歃(0x9F5C) 濬(0xE05C) 畚(0xE15C) 秉(0xE25C) 綵(0xE35C) 臀(0xE45C) 藹(0xE55C) 觸(0xE65C) 軆(0xE75C) 鐔(0xE85C) 饅(0xE95C) 鷭(0xEA5C) x(0xED5C) x(0xEE5C) \(0xFA5C) \(0xFB5C)
美乳テーブルも貼ってあげると、スレの親切度うp。
データ貼るより参考リンク貼ってあげた方が(ry
一瞬、曾という漢字がたらこくちびるで眼鏡かけてるつり目のおっさんに見えた
>>745 たった今、そう見えるようになった。
お前のせいで今後一生見え続けるだろう。どうしてくれる。
>>746 俺にはサザエさんの家に見える
曾 λλλλλλλλλλλλλ....ユカイダナ..
可変桁数の数値にマッチさせるような正規表現ってあります? 一桁〜二桁の数字をあぶり出したいのですが、[0-9][0-9]とかだと二桁数字しか見つけられないっす。 if(($_==[0-9])||($_==[0-9][0-9]))みたいな形にするしかないのかな…
>749 [0-9][0-9]? [0-9]{1,2} \d\d? \d{1,2} とか?
>>750 できました…ありがとうございます。
{2}は00とか88とか同じ数字の連続にしかならないと勘違いしてたようです。
>>751 漏れも始めのうちは勘違いしてたけど、* とか + とか {n,m} とかは、
「前の文字(列)」の繰り返しじゃなくて、「前の正規表現パターン」の繰り返しだからね。
754 :
nobodyさん :03/07/30 07:23 ID:zn2EBRaL
$str= "<table>〜<table>〜</table>〜</table>〜" に対して、真ん中の<table>〜</table>だけを簡単にうまく抽出できないでしょうか? $str =~ s/<table>(^(<table>))*?<\/table>//; なんて文字列に対するキャレットみたいなのが有ればいいのですが。 $tmp = $str; while($tmp =~ m|<table>(.*?)</table>|) {
$str= "<table>〜<table>〜</table>〜</table>〜" に対して、真ん中の<table>〜</table>だけを簡単にうまく抽出できないでしょうか? $str =~ s/<table>(^(<table>))*?<\/table>//; なんて文字列に対するキャレットみたいなのが有ればいいのですが。 $tmp = $str; while ($tmp =~ s/<table>(.*?<\/table>)/\1/) { } $str =~ s/$1//; とするしかないのかな?
すいません…
>>14 に答え有りましたね。
首吊って出直してきます…
あぼーん
758 :
nobodyさん :03/07/30 11:57 ID:xaoebVIF
やりたいこと
JavaScriptでタグの外側の文字のみ置換したい (IE6)
<html><body><script language="JavaScript">
<!--
//PHP
//$word = preg_replace('/(?:^|(?<=>))([^<]*)/e', "preg_replace('/(b)/i','<b>\\\\1</b>','\\1')", $word);
//Perl
//$word =~ s/((?:\G|>)[^<]*?)(b)/$1<b">$2<\/b>/ig;
word = "base bb<a href=\"
http://hoge.hoge/bb/\ ">link Bb</a>bg big";
word2 = "<b>b</b>ase <b>b</b><b>b</b><a href=\"
http://hoge.hoge/bb/\ ">link <b>B</b><b>b</b></a><b>b</b>g <b>b</b>ig";
document.write("これを"+word+"<br>");
document.write("こうしたい"+word2+"<br>");
result = word.replace(/(?:^|(?<=>))([^<]*)/e,word.replace(/(b)/i,\"<b>$1</b>\")");
document.write(result+"<br>");
//-->
</script></body></html>
正規表現も言語によってまちまちですね。
実行するとまっしろです。。
>>758 perlメモよめ(応用を利かせろって事)
760 :
758 :03/07/30 13:31 ID:xaoebVIF
result = word.replace(/(?:^|(?<=>))([^<]*)/,"test"); 正規表現で構文エラーが発生しました。 (?<=>)がいけないみたいなのですが、なぜでしょう?
761 :
758 :03/07/30 15:17 ID:xaoebVIF
JavaScriptでは拡張表現(?が使えない…?
763 :
758 :03/07/30 16:02 ID:xaoebVIF
>>762 あ、やっぱり。
(?<=を自分で作ってやらないといけないわけね。
…作れるの?
あぼーん
766 :
758 :03/07/30 16:21 ID:xaoebVIF
>>764 うーん --;
別の方法考えたほうが早いかな?
あぼーん
しかし
>>758 のパターン(Perl)だと
<a href="c0.html" title="capter0>prologue" target="_blank">
みたいなtagがあったら期待外れの置換をするんじゃないか?
>>768 文句だけ言ってコードを示さないヘタレですか?
>>769 アンタの目には文句に映るのか
ならいい 邪魔したな
>>768 >は>にしろよ。
って言っても屁理屈こねるだろうから
$word = q|base bb<a href="
http://hoge.hoge/bb/ " title="capter0>prologue" target="_blank">link Bb</a>bg big|;
$word =~s/(^|<(?:[^<>]*"[^"]*"[^<>]*)*>|<(?:[^<>]*'[^']*'[^<>]*)*>|<[^<>"]+>)([^<]*)
/my $tmp1 = $1; (my $tmp2 = $2) =~ s!(b)!<b>$1<\/b>!ig; $tmp1.$tmp2/xegs;
print $word;
同様にJavaScriptでも
function hoge () {
word = "base bb<a href=\"
http://hoge.hoge/bb/\ " title=\"2>1\" blank=\"_blank\">link Bb</a>bg big";
re = new RegExp("(^|<(?:[^<>]*\"[^\"]*\"[^<>]*)*>|<(?:[^<>]*\'[^\"]*\'[^<>]*)*>|<[^<>\"]+>)([^<>]+)", "g");
result = word.replace(re,
function test (str, p1, p2) {
re = new RegExp("(b)", "ig");
p2 = p2.replace(re, "<b>$1</b>");
return p1+p2;
}
);
alert(result);
}
772 :
771 :03/07/31 10:27 ID:???
$word = q|base bb<a href="
http://hoge.hoge/bb/ " title='"2>1"1>1' target="_blank">link Bb</a>bg big|;
$word =~s/(^|<(?:[^<>'"]*"[^"]*"[^<>'"]*|[^<>'"]*'[^']*'[^<>'"]*)+>|<[^<>'"]+>)([^<>]*)
/my $tmp1 = $1; (my $tmp2 = $2) =~ s!(b)!<b>$1<\/b>!ig; $tmp1.$tmp2/xegs;
print $word;
function hoge () {
word = "base bb<a href=\"
http://hoge.hoge/bb/\ " title='\"2>1\"1>1' target=\"_blank\">link Bb</a>bg big";
re = new RegExp("(^|<(?:[^<>'\"]*\"[^\"]*\"[^<>'\"]*|[^<>'\"]*'[^']*'[^<>'\"]*)+>|<[^<>'\"]+>)([^<>]*)", "g");
result = word.replace(re,
function test (str, p1, p2) {
re = new RegExp("(b)", "ig");
p2 = p2.replace(re, "<b>$1</b>");
return p1+p2;
}
);
alert(result);
}
の方が正確か。
いい加減にウザイな。因みに script タグのところに javascript バージョン明示してもダメなのカナ? javascript 嫌いだからどうでもいいが
>>773 何に対して書いてるんだ?> javascript バージョン明示
もちょっとHTMLを勉強しろよな。 5年前の知識をそのまま使ってないか?
778 :
758 :03/08/01 09:15 ID:9x/frkaP
>>771 JavaScriptでも出来るんだ。
RegExp("(^|<(?:[^<>'\"]*\"[^\"]*\"[^<>'\"]*|[^<>'\"]*'[^']*'[^<>'\"]*)+>|<[^<>'\"]+>)([^<>]*)", "g");
これを自分で解析できないってことは、自力なんてとても無理ですね。
あーあ勉強不足。
779 :
nobodyさん? :03/08/02 00:16 ID:lx3eHYOp
ファイル名をフォームから指定させたいのですが、いたずらで変なファイル名 を入力されたら困るので、英数字といくつかの記号と日本語 (EUC-JPで文字セットはJIS X0208の範囲)だけに限定したいのですが、 /[\w_\-: -(?:\xFE\xFE)/ であってますか?
rubyなら/\w/eで日本語もマッチするみたいですね。
あげあげ
\<[^<>]*\> ↑これってHTMLとかのタグ(+中身)を表すと思ったのですが、間違ってますか? 2ちゃんの適当なスレッドを読み込んで、サクラエディタで空文字""に置換して txtにしようとすると、置換が永遠に行われ続けます・・。なじぇ?(;´Д⊂
>>773 タグとりたいんなら<[^>]*>でない?
みなさん、入力されたメールアドレスの形式チェックって、どのくらい厳密にやってますか? Perlメモには超長いのが載ってますが・・・ ちなみに自分は、 /[\w\.\-\_]+\@[\w\.\-\_]+\.[a-zA-Z]{2,5}$/ ってやってるんですが・・・
1111111とかaaaaaとか、同じ文字がn文字以上続く場合に マッチさせるのってどうやればよいのでしょうか?
>>788 1{n,} 2{n,} 3{n,}・・・
と一つずつ指定していかなければならないのでしょうか?
>>789 ・・・ある1文字を表す正規表現は.(ピリオド)だ。
>>790 .{n,}だと、aaaaaだけじゃなくabcdeもマッチするのですが・・・
(.)\1{n-1}
>>792 ありがとうございます
・・・いや、それも前に試したんですけど
マッチしないとおもったら他の部分間違えてた・・・_| ̄|○
htmlコメントタグの正規表現教えて下さい。 "<!--[^(-->)]*-->" じゃないの?(;´Д⊂
がいしゅつって言われると思うけど アンカーのアドレスと中身を抽出する正規表現教えて
>>794-795 そんな質問
>>2 を読めって言われるだけだ。
まあ可哀想だから回答しといてやる。
>>2 嫁。
・おまけ
[^(-->)]←こんな書き方できんぞ。
(--;)
( -Д-)
799 :
nobodyさん :03/08/11 23:28 ID:DlYo/nU/
118.33-38(-0.78) 為替レートなのですが こう言う表記がされていて 118と33と38と-0.78を抜き出したいのでつ。 もう一つのパターンが1.1332-37(0.0025) なのでつが 1.1332と1.1337と0.0025を抜き出したいのでつ。 お願いします。
800 :
nobodyさん :03/08/11 23:32 ID:2ChtRC4J
23歳の割には幼い顔立ちをしている杏奈ちゃん。
制服姿もよく似合います。パイパン?と思われるほど陰毛が激薄なので
指姦、挿入シーンは注目してみてください!
フェラのテクニックなんかはやっぱり十代のそれとは比べ物になりませんね。
素人援交女の悶絶痴態 !
無料ムービー観てね
http://www.geisyagirl.com/
>>799 $str = '118.33-38(-0.78)';
if ( $str =~/(\d+)\.(\d+)-(\d+)\((\-?\d+\.\d+)\)/ ) {
$str1 = $1;
$str2 = $2;
$str3 = $3;
$str4 = $4;
}
print $str1,"\n";
print $str2,"\n";
print $str3,"\n";
print $str4,"\n";
$str = '1.1332-37(0.0025)';
if ( $str =~/(\d+\.\d+)-(\d+(?:\.\d+)?)\((\-?\d+\.\d+)\)/ ) {
$str1 = $1;
$str2 = substr($str1, 0, length($money1)-length($2)).$2;
$str3 = $3;
}
print $str1,"\n";
print $str2,"\n";
print $str3,"\n";
802 :
nobodyさん :03/08/12 08:50 ID:3acz8emq
803 :
(^o^)/...http://pleasant.e-city.tv/ :03/08/12 21:11 ID:P8GdC1tU
804 :
nobodyさん :03/08/13 03:36 ID:+G82bcJ9
質問させてください。 メールヘッダを解析するプログラムを作っているのですが、 「 Yahoo!オークション - 自動再出品:---.---(c00000000) Mime-Version: 1.0」 このようなヘッダのsubject部だけを取り出そうと $subject =~ s/(.*)\n.+?\:\s*?.+?/$1/s; こういう正規表現を書きました。 しかし、取り出し結果は 「 Yahoo!オークション - 自動再出品:---.---(c00000000)1.0」 こうなっております。 なぜ、「Mime-Version: 」だけ取れたのか、不思議で仕方ありません。 なぜならば、 $subject =~ s/(.*)(\n.+?\:\s*?.+?)/$1$2/s; こうやるとしっかりとそのまま出るからです。 空回りしているのは承知ですが、どうか教えてください。 宜しくお願いいたします。
>>806 正規表現の後半の部分が \:\s*?.+? だと最短マッチだから ": " にマッチするから、
"1.0" が残ったんでしょ。
補足。こうすればどれがどこにマッチしたかわかりやすいかな。 $subject =~ s/(.*)(\n.+?\:\s*?.+?)/[$1][$2]/; ところで、正規表現パターンに s オプションがついてるけど、それどゆ意味?
>>805-806 夜遅くに、本当に有難うございました。
やはり空回りしてましたね。
最後の?をとったらあっさり通りました。
ということは、半角スペースはピリオドでは引っかからないと
いうことですかね。これはこれで今ごろ知りました。やばい。
s オプションをつけたのは、改行が含まれるからです。
これで気兼ねなく眠れます。
本当に有難うございました。
>>809 > ということは、半角スペースはピリオドでは引っかからないと
> いうことですかね。これはこれで今ごろ知りました。やばい。
違うっしょ。
上の例の場合だと、 "\s*?" は最小一致になってるからゼロ文字にマッチして、
空白はその後ろの ".+?" に食べられてるでしょ。
809 :
nobodyさん :03/08/13 06:33 ID:EIv2Ifoy
>>808 \sは「空白文字」ですよね?
なので空白文字以外は引っかからないと思うのですが、
いかがでしょう。
理解不足ですみません。
>>811 ありゃ、漏れの方が空回りしてたかな。その通りです。
>>813 なんか不思議ですよね。
個人的に非常に気になるところです
(⌒V⌒) │ ^ ^ │<これからも僕を応援して下さいね(^^)。 ⊂| |つ (_)(_) 山崎パン
816 :
nobodyさん :03/08/16 05:13 ID:0jlc9p4o
phpなんですがある文字列を検索するときにタグを検索対象外にするにはどうすればいいんでしょうか? 例えば <font size=3>font</font> から「font」を検索する場合にfontタグは検索結果に含めないという意味です。
817 :
nobodyさん :03/08/16 06:07 ID:s3eL1VQH
818 :
nobodyさん :03/08/16 07:48 ID:w5cGb34c
>>816 strip_tags()っていう関数があるけど
819 :
nobodyさん :03/08/18 02:08 ID:BFUuzXu6
フルパスからディレクトリ名を得る正規表現を教えてください。 ただし、最後のスラッシュはいらないです。 たとえば /usr/local/apache/logs/access_log このファイルだったら /usr/local/apache/logs/ ← こうではなく /usr/local/apache/logs ←このようにしたい
821 :
820 :03/08/18 02:31 ID:???
s{/[^/]*$}{}; の方が良いか。
822 :
819 :03/08/18 02:32 ID:???
スレ違いかもしれませんが。
.htaccessのRedirectMatchで正規表現を使い以下のような置き換えを
しようとしてるんですが、上手くいきません。アドバイスおながいします
hoge.com/diary/diary.cgi?d=20030818 をhoge.com/diary/?date=20030818
にしたいとき。
RedirectMatch diary\.cgi\?d=(.*)$
http://hoge.com/diary/?date=$1 ?は\でエスケープできないのかなぁ。
例えば、
RedirectMatch diary\.cgi\_d=(.*)$
のように、?以外にするとひっかかるし。
あと、置き換え後の
http://hoge.com/diary/?date=$1 に関しては、? が %3f になってしまうのもよくわかりません。。
824 :
823 :03/08/18 08:12 ID:???
うわ、間違えた。 (*)じゃなくって、(.*)ですた。スマソ
>>823 DirectoryIndex diary.cgi
という手もあるが、RFC2606 嫁とも云いたくなる(w
初心者質問ですみません。 ある文字とある文字の間の文字だけ置き換えるのって、どうやるのでしょう? 例えば、「[1-9]お○こ[a-z]」を「[1-9]○んこ[a-z]」にしたい場合で、 [1-9]と[a-z]は変えない場合です。
>>826 s/(?<=[1-9])お○こ(?=[a-z])/○んこ/g;
おめこ まんこ
830 :
nobodyさん :03/08/29 06:52 ID:W0Mz6JX/
( ゚Д゚)ホシュ
文頭から見た「-」から文末から見た「.」の間の文字列を出力するにはどうしたらよいんでしょうか? 例 1234567890-abcde.jpg → abcde 1234567890-ab.cde.jpg → ab.cde abcdeの文字列、文字数は常に変化します。
833 :
nobodyさん :03/09/02 18:05 ID:1YbtwYMS
>>832 .*?-(.*?).jpg$
ん?もしかしてこれも釣り?
.*?-(.*).jpg$ が正解じゃね?
WZ4.0の置換を使って \n\n\n任意の一行 を </dd>\n<dt>\n任意の一行\n</dt>\n<dd> にしたいのだが『^.*$』では任意の一行にならない・・・ おそらくおれが正規表現歴2時間だから きっとドキュソなんだろう 先生教えてください おながいします
838 :
837 :03/09/04 04:21 ID:???
少し問い方が間違えたようだ \n \n \n 任意の文字列\n を </dd>\n <dt>\n 任意の文字列\n </dt>\n <dd>\n にしたいが『.*』でならない・・・ だみだ〜
>>838 たかだか2、3時間の試行錯誤でギブかい?
840 :
837 :03/09/04 05:43 ID:???
>>839 えっと、まだ頑張ってます(w
NEC版の世界大百科事典をJIS-X4081(EPWINGのサブセット)可しようと思ってね
DDwinで全文をテキスト抽出したのはいいのだが編集で挫けそうになってる
EBStudioで変換できるHTML形式にしないといけないのに
全行を一つのスカラー変数に読み込んでから $all_lines =~ s|\n\n\n([^\n]+)\n|</dd>\n<dt>\n$1\n</dt>\n<dd>\n|gs; でどう?
>>838 my $str = qq|
任意の文字列1
任意の文字列2
|;
print $str;
$str =~ s!\n{3}(.+)\n!</dd>\n<dt>\n$1\n</dt>\n<dd>\n!g;
print $str;
国内からのアクセスだけを許可する目的で、IPアドレスから判断する文を
書いてみましたが、これでいけてます?
if (
($ip =~ /^133\.(\d+)\.(\d+)\.(\d+)$/) ||
($ip =~ /^192\.(50|218|244)\.(\d+)\.(\d+)$/) ||
($ip =~ /^202\.(1[135-]|2[3-6]|3[2-5]|48|2(0[89]|[1-5]\d))\.(\d+)\.(\d+)$/) ||
($ip =~ /^203\.1(3[6-]|4[01])\.(\d+)\.(\d+)$/) ||
($ip =~ /^210\.(1(2[89]|[3-6]\d|7[-5]|8[89]|9[016-9])|2(2[4-]|3\d|4[89]|5\d))\.(\d+)\.(\d+)$/) ||
($ip =~ /^211\.([-9]|1\d|1(2\d|3[-5]))\.(\d+)\.(\d+)$/) ||
($ip =~ /^218\.(4[-7]|110|2(1[6-]|2\d|3[01]))\.(\d+)\.(\d+)$/) ||
($ip =~ /^219\.(9[6-]|1([01]\d|2[-7]|6[-7]))\.(\d+)\.(\d+)$/) ||
($ip =~ /^220\.(9[6-]|1(0[4-]|1[01]|4[45])|2(0[89]|1\d|2[-3]))\.(\d+)\.(\d+)$/) ||
($ip =~ /^221\.11[2-]\.(\d+)\.(\d+)$/) ||
($ip =~ /^61\.(1(1[2-]|2[-7]|9[2-])|2(0\d|1[-5]))\.(\d+)\.(\d+)$/)
) { …
参考:国内のIPアドレス範囲
ttp://www.nic.ad.jp/ja/dns/jp-addr-block.html
漏れなら正規表現使わずビットパターン(ry
845 :
837 :03/09/04 13:10 ID:???
WZ4.0の正規表現は[]内に\nが使えないよ。 っともう関係ないか。
ある文字列が、数字になってるかどうかって、正規表現一発で表せるもんでしょうか・・・? ちなみにできればPerlで・・・ 0 23 -23 2.3456 -2.3456 あたりはOKだけど、 0003とかはだめ。 3.0はOK +4は(本当は数学的にはOKだけど)ダメ てなかんじで・・
>>847 まあまずはとりあえず自分で書いてここに晒してみな。
PHPで $str = "あ[B]いう[/B]え[I]おか[/I]き[B]くけ[/B]こ"; から $str = "あ<b>いう</b>え<i>おか</i>き<b>くけ</b>こ"; という結果を得るにはどうすればいいですが? preg_split('{\[B\](.+)\[/B\]}i', '<b>\\1</b>', $str); preg_split('{\[B\]([^\[]+)\[/B\]}i', '<b>\\1</b>', $str); としてもうまく行きません。
追記ですが、 $str = "[B]いろは[I]にほ[/I]へと[/B]"; みたいに入れ子になったやつもうまくできるようにしたいのです。
preg_replace( "{\[(/?[BI])\]}ie", "strtolower('<\\1>')", $str ); とか。この場合、文字コードが SJIS とかだとうまくいかないかも。 マルチバイト正規表現関数が使えるのなら、 mb_ereg_replace( "\[(/?[BI])\]", "strtolower('<\\1>')", $str, "ie" ); という感じでいけそう。
853 :
nobodyさん :03/09/11 10:27 ID:zLbTeLZD
>>850 正規表現使わんでも
str_replaceで出来る。
$str=str_replace(array("[","]","B","I"),array("<",">","b","i"),$str);
とか
$str=str_replace(array("[B]","[/B]","[I]","[/I]"),array("<b>","</b>","<i>","</i>"),$str);
最近ちょっとずつ正規表現が好きになってきたのですが、早くも挫折気味です。 FTPのNLSTで得られる文字列をTAB区切りするのはどうすればいいでしょうか? 例えば下記(半角スペースは省略されるため_に変更してあります) -rw-r--r--___1_hogehoge___hogehoge________714_Sep_11_10:45_test.txt のような場合はシンプルに (PHPで) ereg_replace ("_+", "\t", $filelist); (viで) :%s/_+/\t/g でいけますが、もしファイル名にスペースが入った場合はいけません。
BREGEXP使ってるんですが 英単語数えたいんですがどうすればよいかわかりません。 連続してマッチできないんです。 「m/.../g」で出来ないです。
m/.../gs 複数行とか
857 :
nobodyさん :03/09/15 15:51 ID:L3/wYHWQ
BREGEXP.DLLで、英単語抜き取ろうと思うと [a-zA-Z'-]+\b でいいんですか? BREGEXP.DLLでは、「\b」は、単語の境界にマッチするらしいです
質問なのですが、正規表現て[abc[^d]]みたいな事は出来ましたっけ? Javascriptでブラケット内に指定していないはずの文字が引っかかってしまうので 個別に除外したいのです
859 :
nobodyさん :03/09/16 18:55 ID:zwrMF0bN
sageたままになってました
>>858 ふつーできない。
それより、その大元の問題になってる正規表現を晒して見る気はないかい?
861 :
nobodyさん :03/09/16 19:55 ID:e1qNs9iA
perlを使った文章の置換で、特定の文字を含む行の削除をするとき s/.*hoge.*\n//gi とやっていて、これをhogeを含まない行の削除に変更しようとおもい s/.*[^hoge].*\n//gi とやってみたんですが、どうもうまく動きません。 どこが間違っているのでしょうか・・・?
>>860 やはりか…
晒したいのですが根城がバレそうなので一応やめときます
>>861 split して grep して join するのが楽かも。敢えて解答は書かないので考えてみて。
865 :
861 :03/09/16 22:00 ID:e1qNs9iA
>>863 ,864
ううん。。。わからんです
s/.*(?!hoge).*\n//gi
にしてみたんだけど・・・だめぽい
もしかして、一行でやるのは無理なのかしら
865はのび太
>>865 気持ちはわかるけど、正規表現で全てを行うことに囚われすぎ。
while(<FILE>){
next if /hoge/;
print;
}
でいいじゃん。
868 :
867 :03/09/17 01:29 ID:???
間違った。ifじゃなくてunless。
>>865 ワロタw
>>867 ,868
できました。ありがとう!
>>869 それだとこんな↓変なエラーが出ました・・・なんでだろ
入力レコードが最大長を超えました。より大きい最大長を指定してください。
ちなみにcygwinのperlで動かしましたです。。。
正規表現じゃないんだけど友人にこんなやり方も教えて貰いました
cat xxx.txt | grep -v hoge
レスくれた人どうもでした。
POSTやGET受け取ったデータたとえば a=1&b=&c=&d=2&e=3 というようなデータのパラメータが空の部分だけ取り除いて a=1&d=2&e=3 という形にして再びpostしたいのですが、一回の表現でなかなかうまく出来ません。 よい案ないでしょうか?
>>872 すいません大事なこと書き忘れてましたね・・perlです
perlについてです。 openしてファイルから読み込んだ 名前:$hash{name} 日付:$hash2{time} という感じの文字列があります。 この文字列に含まれているハッシュを展開させるにはどのようにすればいいのでしょうか? s/$(\w+?)\{(\w+?)\}/${$1}{$2}/eg; とするのでは無理でした。
>>875 どれが key になって、どれが value になるの? どんな結果を期待しているのかも書いてくれないって(つД`) 最近難しい質問が多いよなぁ。。。
>>875 Perlスレ向きの話題だが。
置換で解決するならシンボリックリファレンスを使う事になる。
no strict 'vars';
local %hash = (name => 'foo');
local %hash2 = (time => scalar localtime time);
my $str = '名前:$hash{name} 日付:$hash2{time}';
no strict 'refs';
$str =~ s/\$([A-Za-z_]\w+){([^}]+)}/${"$1"}{$2}/g;
print $str;
但し下記の方が楽は楽。
my %hash = (name => 'foo');
my %hash2 = (time => scalar localtime time);
my $str = '名前:$hash{name} 日付:$hash2{time}';
eval qq/\$str = "$str"/;
print $str;
いずれにせよ各変数の内容には充分注意しなければ
簡単にクラックされるので事前チェックを入念に。
878 :
875 :03/09/26 00:07 ID:???
>>877 ありがとうございます。
evalの使い道がやっとわかりました。でも確かに下手するとアブナイですね……。
879 :
sage :03/09/29 21:57 ID:gvq1HDpk
どなたかご教授お願いします。 使用する正規表現エンジンはJRE32.DLL です。 論理演算(and or not)にて記入された文字列を正規表現に変換し 文字列の検索を行いたいのですが、 HOGE and FOO and BAR のように、and検索を行う場合はどのような正規表現文字列に 変換すればよろしいでしょうか? (*.HOGE.*)(.*FOO.*)(.*BAR.*)|(.*FOO.*)(.*HOGE.*)(.*BAR.*)| (以下略) は避けたいと思っております。
名前欄にsageと書いてしまいました。 失礼しました・・・。(恥
>>879 strstr やら類似する関数をつかってその結果に対して
論理演算したほうがいいんじゃ?
>>879 ^(?=.*HOGE)(?=.*FOO)(?=.*BAR)
ただJRE32.DLLで動くかは分からない。
884 :
nobodyさん :03/10/03 17:48 ID:iDWA2Ri2
始まりと終わりがAで、間が0-9にマッチさせたいのですが、どうしても分かりません。 マッチさせたいパターン → A123A AA A /^A[0-9]*A$/だと Aにマッチさせられませんでした。 どうぞ、お知恵をお菓子下さい・・
"A123A AA A" は「始まりと終わりがAで、間が0-9」に見えないのだが? もうちょっとマッチさせたい条件をはっきりしる。
こういうことかな? /^A([0-9]*A$|$)/
えとですね、始まりと終わりがAであれば 間には数字があっても無くても良いわけです。 Aも一応始まりと終わりがAなので、マッチさせたいのです。
グホッ
書き込んでいる間に、すみません。
>>886 そうです(TдT)/ 解決しました、本当に有難うございます。
>>887 だから
>マッチさせたいパターン → A123A AA A
数字以外に空白とAがあるだろ?って。
>>889 A123A or AA or A
と表したかったのです。紛らわしくてすみません(^^;
891 :
879 :03/10/03 21:33 ID:???
みなさん、色々ありがとうございました。 また奮闘してみます。
892 :
nobodyさん :03/10/05 20:25 ID:N/gpdKcx
_ / \―。 ( / \_ / / ヽ / ̄ ̄ ̄ ̄ ̄ ...―/ _) < /^ちんちんシュッ!シュッ!シュッ!$/ ノ:::へ_ __ / \_____ |/-=o=- \/_ /::::::ヽ―ヽ -=o=-_(::::::::.ヽ |○/ 。 /::::::::: (:::::::::::::) |::::人__人:::::○ ヽ/ ヽ __ \ / \ | .::::/.| / \lヽ::::ノ丿 / しw/ノ___-イ ∪
PHPのereg_replaceつかってこんなことできますか?
$s='<HTML>省略省略<A HREF='
http://なんちゃら '>あれ これ それ </A>'
↓
$s='<HTML>省略省略<A HREF='
http://なんちゃら '>あれ これ それ </A>'
< > で囲まれていない部分のスペースを でおきかえたいんです
897 :
895 :03/10/06 19:35 ID:???
>>896 そういいたかったんだけど、そう表示されていませんね。失敗しました。
リベンヂ。
$s='<HTML>省略省略<A HREF='
http://なんちゃら '>あれ これ それ </A>'
↓
$s='<HTML>省略省略<A HREF='
http://なんちゃら '>あれ&nbsp;これ&nbsp;&nbsp;それ&nbsp;</A>'
< > で囲まれていない部分のスペースを &nbsp;でおきかえたいんです
どうでしょうか大丈夫かな。
>>897 と表示させたいときには、
&nbsp;と書けばいいよ。
阿呆だ俺…。 s/\\1 / /
ん? s/\\1 /\\1 / でなくて? ここで一句 正規スレ、みんなでハマるnbsp.(字あまり)
つーか単純に 半角スペース" "は" "とかく。 "&"は"&"とかく。 これを覚えておけば、 sub &hogehoge() とかを貼り付けた時にハマることもなくなるよ
そういうの置換してくれる2chブラウザってないのかな。
&
?
? ?
Perlでの正規表現なんですが $pattern =~ s/(\w)(\d)/\1-\2/; という置換の右の式を変数にしたいんです。 $pattern =~ s/(\w)(\d)/$exchange/; ところが $exchange = "\1-\2"; $exchange = "\\1-\\2"; $exchange = '\1-\2'; のどれもダメで、どうしたものか困ってます。誰かボスケテください。
>>907 \1 better written as $1
\2 better written as $2
909 :
907 :03/10/15 22:04 ID:???
>908さんの言わんとする事が理解できてませんが、 なんか全然違う手段(修飾子e)で解決しました。 ありがとうございました。
>>908 はPerlでは後方参照に \1 を使うより $1 を使ってくれ。といいたいらしい
sjis文字,euc文字,jis文字を(文字クラス等で)表現できますか?
913 :
911 :03/10/18 18:49 ID:???
>>913 どんだけ目を凝らして見ても
>>2 にリンク貼ってあるように見えるんだけど。
916 :
現調中 :03/10/27 17:50 ID:???
質問です。何度やっても色々な所を調べても分かりませんでした。
Perlでの置き換えなのですが、
$test = '[tmp="
http://www.yahoo.co.jp "] - [tmp="./test.gif"]';
を置き換えで・・
$test = '
http://www.yahoo.co.jp - ./test.gif'という風にしたいのです。
$test =~ s/\[tmp="(.*)"\]/$1/g; だと、うまく動いてくれません。
[tmp=""]ダブルクォート内の文字は固定されておらず自由に変わります。
宜しかったら教えて頂けないでしょうか?(;_;)
>>916 .* の箇所が問題だね。「最長マッチ」「最短マッチ」で調べましょう。
$test =~ s/\[tmp="([^"\]]*)"\]/$1/g;
919 :
現調中 :03/10/27 19:22 ID:???
>>918 うう(TT)本当に助かりました!
うまく動作しました。
現調が終わったらこれを元に自己学習に励んでみます。
感謝!
正規表現覚えると、簡単な文字列比較にも使ってしまう。 負荷結構かかるんかな
922 :
nobodyさん :03/11/06 21:51 ID:QQMTRNI6
perlで右辺から左辺へマッチするようにはできないの?
いったい何を言ってんでしょ。。。
Ruby みたいにできないか?ってこと? foo =~ /bar/ /bar/ =~ foo
925 :
922 :03/11/06 23:32 ID:???
>>923 ごめんなし日本語うまくないんです。
>>924 Rubyは使ったことないのでよく分からないんですが
例えが
$name="abc";
$name=~ /\w/
だとa→b→cってマッチしちきますよね。それを逆に
c→b→aというふうにできないのでしょうか?
>>925 $_ = 'abcdef';
print /^(\w{3})/; # abc
print /(\w{3})$/; # def
print join '/', /(\w)/g; # a/b/c/d/e/f
$_ = reverse $_;
print join '/', /(\w)/g; # f/e/d/c/b/a
927 :
922 :03/11/07 00:29 ID:???
>>926 ありがとうございます。
やつぱり、文字反転させないとだめなようですね。
ほんとううにありがとう、ございますだ。
アラビア語の正規表現だと右からマッチする・・・わけないか?
そういう意味だったのか。右辺左辺とは違うだろうが。
質問です。 <table>...</table> <table>...</table> <table>...</table> <table>...</table> のように、テーブルの閉じタグと開始タグの行間がバラバラなので、 3行に統一したいのですが、どう書けばよいのでしょうか?
</table>の後ろでENTERキーを4回押すよう努める。
>>930 実装言語は Perl ? $html に HTML 全体が入ってるとして、
$html =~ s/(<\/table>)\s*(<table)/\1\n\n\n\2/ig;
933 :
930 :03/11/07 14:28 ID:???
>>931 解決しました。ありがとうございました。
935 :
932 :03/11/10 17:40 ID:???
(⊃д`)
(⊃д`)ヽ(゚Д゚ )ヨシヨシ
ネタで解決ってのも珍しいな
938 :
nobodyさん :03/11/12 06:23 ID:VJcp1gvZ
質問です。 例えば、以下のようなデーターが別ファイルになっていた時、 $ab_cd = '12ab' ; # aaaaaa $efg_h = 'あいう'; # ccccc これを、 $in[0] = abc_cd $in[1] = efg_h $aa[0] = 12ab $aa[1] = あいう のように取り出す方法と、値を変えてもとの位置に置き換える方法の二つをお願いします。
>>938 それは正規表現で解決できる問題じゃないと思う。
940 :
nobodyさん :03/11/12 14:39 ID:VJcp1gvZ
いや、だから、正規表現の部分で教えてほしい事柄とは検索と置換なんです 前にですね、 @buffer = <IN>; foreach $line (@buffer) { if( $line =~ /(この部分が不明)/)[ $in[0] = $1; $aa[0] = $2; } } といったようなものを見かけましたので、「(この部分が不明)}として示した部分を教えてもらえば何とかなると思ったのです。
いや、だから、 いや、だから、 いや、だから、 いや、だから、
>>940 かなり適当。
/^\$(\w+)\s*=\s*([\'\"])([^\'\"]+)\2/
>>940 じゃあ最初からそれを書(ry
情報の小出しはよくない。
944 :
nobodyさん :03/11/12 20:13 ID:VJcp1gvZ
>>942 うまくできました。ありがとうございました。
945 :
nobodyさん :03/11/12 21:54 ID:VJcp1gvZ
忘れていましたので、再び質問です。 @wday = ('日','月','火','水','木','金','土') ; といった感じのものを、「wday」と「'日','月','火','水','木','金','土'」として取り出す正規表現を教えてください。
前のもそうだけど「wday」を得たいとか言うのからしておかしいよな 根本的なコードの書き方に疑問が
948 :
nobodyさん :03/11/12 22:30 ID:VJcp1gvZ
>>947 「wday」は例で、
@abc = ('aa','bb','cc'); #aaaaaa
の場合の、「abc」と「'aa','bb','cc'」でも良いのです。
$in = $1; $dd{$in} = $2; として取り出したいだけなので。
いや、だから、それがおかしいと言ってるのだが ま、好きにすればいいや
>>949 漏れはその気持ちはわからないでもないよ。
たとえば、そういう糞コード書き散らした香具師がいて、
ハードコードしてたデータをハッシュテーブルに直す修正を一括して行いたい、とか。
>>948 例によってかなり適当。
/^\@(\w+)\s*\=\s*\(([^\)]*)\)/
951 :
nobodyさん :03/11/12 23:54 ID:VJcp1gvZ
>>950 ありがとうございました。うまくいきました。
>>950 この程度のことを自力で解決できない香具師はまた糞コードを書き散らすと思われ
俺は、糞コードを撒き散らしながら今日まで成長してきた。
俺は、糞を撒き散らしながら(ry
俺は、糞を巻きなが(ry
俺は、糞
bokuso
僕掃除当番
PHPでの正規表現について質問です。 if (ereg("<(.*@docomo\.ne\.jp)>",$str,$match)) { // i }elseif (ereg("<(.*@ezweb\.ne\.jp)>" ,$str,$match)) { // ez }elseif (ereg("<(.*@[dhtckrnsq]\.vodafone\.ne\.jp)>", $str ,$match)){ // v }elseif (ereg("<(.*@jp-[dhtckrnsq]\.ne\.jp)>" , $str ,$match)){ // j }else{ } return $match[1]; というような動きの関数を作りました。 $strには複数の< > 付きメールアドレスがあります。 その文字列の一番最初に見つけた<>付きメールアドレスから <>をとった純粋なメールアドレスを取得したいと思っております。 今のままですと、メールの後のほうにある>に反応してしまいます。 どうぞお知恵をお貸しくださいっっ。
PHPのことは全くもって知らないんだけど (.*@docomo\.ne\.jp) ↓ ([^>]+?@docomo\.ne\.jp) こういうのってPHPじゃ使えないの?
>>961 [^>]+なら最短マッチにしなくても最初の>で止まるし。
つかRFC2822的には@の前に>来てもOKだし。
0文字のユーザ名を許可しないなら.+?でいいのでは。
>>960 私もPHP知らんけどeregでは最短マッチ使えなくて
preg_matchを使えって事らしい。ググって。
RFC的な話は別にして、メールアカウントとして普通に認められる文字って 英数と - _ ぐらいだと思う(Yahoo mailでは - も使えなかった)ので [-\w]+?@docomo\.ne\.jp で充分なんじゃない? 後ろに @ があるので最短マッチにせず [-\w]+@docomo\.ne\.jp でも同じだと思うけど。 余計なものはなるべく認めないという方向で。
>>963 せめて先頭はアルファベットくらいは判別した方が。
docomoのメルアドって今でも電番だけのやつって通用するのかな? だとすると先頭をアルファベットに限定するのはマズイかも 0で始まるのだけ含むってのはアリかもしれないけど
(´-`).。oO(なんで RFC を無視しちゃうんだろうねぇ。。。)
>RFC 的には不正な、@ 直前に . が来るメールアドレス いったいどのRFCに使えないなんていう記述が?
PerlメモのURL文字列を判別するやつのように RFC完全準拠となると実用に耐えない正規表現になることもあるので ほどほどにってことで。特にRFC崇拝者は。
>>968 RFC 2822 より
addr-spec = local-part "@" domain
local-part = dot-atom / quoted-string / obs-local-part
dot-atom = [CFWS] dot-atom-text [CFWS]
dot-atom-text = 1*atext *("." 1*atext) ; 注目
obs-local-part = word *("." word) ; 注目
word = atom / quoted-string
atom = [CFWS] 1*atext [CFWS]
atext = ALPHA / DIGIT /
"!" / "#" / "$" / "%" / "&" / "'" /
"*" / "+" / "-" / "/" / "=" / "?" /
"^" / "_" / "`" / "{" / "|" / "}" / "~"
よって local-part の途中に . が来るのは OK (
[email protected] )
だが、末尾 (@ の直前) に来るのは NG (
[email protected] ) 。
>>969 お前が RFC を読めないからって滅茶苦茶言うなよ。
>>969 は、保守性と処理速度を鑑みて「実用に耐えない」だと思う。
速度も保守性もそれほど違わんと思うが...。 単に分かったとこだけで済ましとこうというのが 本音のような気もする。
(?:(?:[a-z]|[A-Z])(?:(?:[a-z]|[A-Z])|[0-9]|[-+.])*:(?:(?://(?:(?:( ?:(?:(?:(?:(?:[a-z]|[A-Z])|[0-9])|[-_.!~*'()])|%(?:[0-9]|[A-Fa-f]) (?:[0-9]|[A-Fa-f])|[;:&=+$,])*@)?(?:(?:(?:(?:(?:[a-z]|[A-Z])|[0-9] )|(?:(?:[a-z]|[A-Z])|[0-9])(?:(?:(?:[a-z]|[A-Z])|[0-9])|-)*(?:(?:[ a-z]|[A-Z])|[0-9]))\.)*(?:(?:[a-z]|[A-Z])|(?:[a-z]|[A-Z])(?:(?:(?: [a-z]|[A-Z])|[0-9])|-)*(?:(?:[a-z]|[A-Z])|[0-9]))\.?|[0-9]+\.[0-9] +\.[0-9]+\.[0-9]+)(?::[0-9]*)?)?|(?:(?:(?:(?:[a-z]|[A-Z])|[0-9])|[ -_.!~*'()])|%(?:[0-9]|[A-Fa-f])(?:[0-9]|[A-Fa-f])|[$,;:@&=+])+)(?: /(?:(?:(?:(?:[a-z]|[A-Z])|[0-9])|[-_.!~*'()])|%(?:[0-9]|[A-Fa-f])( ?:[0-9]|[A-Fa-f])|[:@&=+$,])*(?:;(?:(?:(?:(?:[a-z]|[A-Z])|[0-9])|[ -_.!~*'()])|%(?:[0-9]|[A-Fa-f])(?:[0-9]|[A-Fa-f])|[:@&=+$,])*)*(?: /(?:(?:(?:(?:[a-z]|[A-Z])|[0-9])|[-_.!~*'()])|%(?:[0-9]|[A-Fa-f])( ?:[0-9]|[A-Fa-f])|[:@&=+$,])*(?:;(?:(?:(?:(?:[a-z]|[A-Z])|[0-9])|[ -_.!~*'()])|%(?:[0-9]|[A-Fa-f])(?:[0-9]|[A-Fa-f])|[:@&=+$,])*)*)*) ?|/(?:(?:(?:(?:[a-z]|[A-Z])|[0-9])|[-_.!~*'()])|%(?:[0-9]|[A-Fa-f] )(?:[0-9]|[A-Fa-f])|[:@&=+$,])*(?:;(?:(?:(?:(?:[a-z]|[A-Z])|[0-9]) |[-_.!~*'()])|%(?:[0-9]|[A-Fa-f])(?:[0-9]|[A-Fa-f])|[:@&=+$,])*)*( ?:/(?:(?:(?:(?:[a-z]|[A-Z])|[0-9])|[-_.!~*'()])|%(?:[0-9]|[A-Fa-f] )(?:[0-9]|[A-Fa-f])|[:@&=+$,])*(?:;(?:(?:(?:(?:[a-z]|[A-Z])|[0-9]) |[-_.!~*'()])|%(?:[0-9]|[A-Fa-f])(?:[0-9]|[A-Fa-f])|[:@&=+$,])*)*) *)(?:\?(?:[;/?:@&=+$,]|(?:(?:(?:[a-z]|[A-Z])|[0-9])|[-_.!~*'()])|% (?:[0-9]|[A-Fa-f])(?:[0-9]|[A-Fa-f]))*)?|(?:(?:(?:(?:[a-z]|[A-Z])| [0-9])|[-_.!~*'()])|%(?:[0-9]|[A-Fa-f])(?:[0-9]|[A-Fa-f])|[;?:@&=+ $,])(?:[;/?:@&=+$,]|(?:(?:(?:[a-z]|[A-Z])|[0-9])|[-_.!~*'()])|%(?: [0-9]|[A-Fa-f])(?:[0-9]|[A-Fa-f]))*)|(?://(?:(?:(?:(?:(?:(?:(?:[a- z]|[A-Z])|[0-9])|[-_.!~*'()])|%(?:[0-9]|[A-Fa-f])(?:[0-9]|[A-Fa-f] )|[;:&=+$,])*@)?(?:(?:(?:(?:(?:[a-z]|[A-Z])|[0-9])|(?:(?:[a-z]|[A- Z])|[0-9])(?:(?:(?:[a-z]|[A-Z])|[0-9])|-)*(?:(?:[a-z]|[A-Z])|[0-9] 以下省(ry
おしい。 ちょい工夫するともっと分かりやすく正確な表現になる。 って大昔からくりかえし話題になるネタだけど。 実際上はそこまでしないで逃げる罠。
>>960 の目的はメールアドレスが RFC 的に valid かを調べる事じゃ
ないし、domain は固定なので、厳密に調べるにしても必要なのは
local-part の正規表現だけだ。
my $atext = qr"[!#\$%&'*+\-/0-9=?A-Z^_`a-z{|}~]";
my $qtext = qr/[^\x0A\x0D"\\\x80-\xFF]*/;
my $valid_local_part = qr/
(?:$atext+(?!$atext)|"$qtext(?:\\[^\x80-\xFF]$qtext)*")
(?:\.$atext+(?!$atext)|"$qtext(?:\\[^\x80-\xFF]$qtext)*")*
/x;
. の使い方に目くじらを立てなければこうできる。
my $loose_local_part = qr{
(?:
[!#\$%&'*+\-./0-9=?A-Z^_`a-z{|}~]+
| "$qtext(?:\\[^\x80-\xFF]$qtext)*"
)+
}x;
これで foo.bar.@domain も "(>_<)\ {@o@}"@domain も通る。
クエリのチェックをしようとしているのですが、どうすれば良いのでしょうか。 形式は「一つの組は英数字=英数字、複数ある場合は&区切り」という一般的なもので、 ここでのチェックは単にその形式に沿っているかどうかを判断するだけとしたいと思い m/^(((\w*?)?=?(\w*?)?)?(\&?))+$/ とやってみたのですが、「=」が二つ続いていたら通ってしまうなど駄目なようで、 この辺りで詰まって解らなくなり質問に来た次第です。
>>978 英数字は空文字を許さない、とかなら、こんなんでいいのでは?
「英数字=英数字」、複数ある場合はこの後にさらに「&英数字=英数字」を繰り返し。
m/^\w+\=\w+(?:\&\w+\=\w+)*$/
「英数字=なし」もあるよね これでうまくできた気がするけど \w+?=\w*?(&\w+?=\w*?)*