トップページphp
986コメント301KB

正規表現道場@2ch

レス数が950を超えています。1000を超えると書き込みができなくなります。
0001ヽ(´▽`)ノ2001/07/26(木) 09:03ID:???
以外と毛嫌いして居る人も多そうな正規表現、
でもperlを使いのなす上で避けて通れない道だったりするかもです。
そこで、スクラップブック的に目に止まったカッコイイ正規表現を
書き留めておこうと言うスレッドです。
質問する時は言語と、得たい結果をなるべく詳しく書いてね。

取り合えず僕が知ってる有用なリンクです。
http://www.din.or.jp/~ohzaki/perl.htm
http://www.kt.rim.or.jp/~kbk/regex/regex.html

もっとイイ(・∀・) リンクは>>2-10さん辺りが書いてくれるカモ・・・・
087987802/11/05 14:42ID:???
訂正。
-----
もとデーターは
http://www.ss.iij4u.or.jp/~osamu-s/bibliography.htm

http://ime.nu/homepage.mac.com/hitou/satoyama/bunken.html
で作ったファイルをgrepしたものです。

0880nobodyさん02/11/05 14:43ID:???
>>878
タグがついてるし、複数行もあるけど?
0881nobodyさん02/11/05 15:01ID:???
>>878
Perlでなら簡単にできるが、シェルコマンドでやりたいの?
088287802/11/05 15:37ID:???
ソートできるのであれば、何でもいいんです。

それから、僕はタグはw3m -dumpしました。
0883nobody02/11/05 21:49ID:???
>>882
これはどう?
while(<>) {
$landscape{$1} = $_ if /\Qランドスケープ研究\E.+?(\d.+)/;
}
foreach $key (sort {$a <=> $b;} %landscape) {
print $landscape{$key};
}
sjisでやるときのために、\Q\E入れますた。

0884nobodyさん02/11/05 22:29ID:???
>>883
で、できました!!!!

こんなに短く書けるのですね!!!

perlと883タン
って何てすばらしいんだろう!!!


0885nobody02/11/05 22:38ID:???
>>884
よかったっすね。
ところで、書き込んでから後で気づいたんだけど、昇順ソートにもかかわらず、
61: 296-298.の方が61: 287-289.より前に来ちゃうのよね。どしてー?

0886 ◆hMJAPH9PWA 02/11/06 15:07ID:???
>>885
"61: xxx-xxx"の61しか見てないからだよ。
0887nobodyさん02/11/06 16:45ID:???
>>886
(\d.+)/て最長(行末まで)に一致しない?
0888nobodyさん02/11/06 22:30ID:???
cmp と <=>
0889nobodyさん02/11/06 22:49ID:???
>>888(末広がりさん)
記号や空白は、数値としては解釈されないんですね。
ありがd


0890nobodyさん02/11/07 10:52ID:hTcjcUGC
#から#までをボールド
/から/までをイタリック

#hello# -> <b>hello</b>
/hello/ -> <i>hello</i>

s|#(.*?)#|<b>$1</b>|g;
s|/(.*?)/|<i>$1</i>|g;

としてましたが

#hello/nest#hello/
ってのがきちゃうと
<b>hello<i>nest</b>hello</i>
ってなっちゃいます。
<b>hello<i>nest</i></b><i>hello</i>
ってしたいんですけどスマートな解決法ありませんでしょうか?
0891nobodyさん02/11/07 12:02ID:???
>>890
#hello/nest/#/hello/
0892nobodyさん02/11/07 12:08ID:???
>>890
/だと閉じタグの/と紛らわしいので他のにしてください。
0893nobodyさん02/11/07 15:20ID:???
perlの正規表現で
29から44までの数字ってどう表しますか?

for(29..44)は使わないで、表現してください。


0894nobodyさん02/11/07 16:09ID:???
/(?:29|3[0-9]|4[0-4]/
0895nobodyさん02/11/07 16:09ID:???
カッコは不要か
/29|3[0-9]|4[0-4]/
0896教えて偉い人02/11/07 19:37ID:???
えーと テキスト中に入れ込むマクロということで、 [@ と @] でくくっています。
で、
[@ [@ xx @] @] <= 本文
1__2_____3__4 <= 話をわかりやすくするための括弧の通し番号

こんな風になったとき、最短の [@ xx @] (番号 2と3 )を取り出したいのですが
最短一致で [@ .+? @] としても [@ [@ xx @] (番号 1と3 )が取り出されます。
どうすればいいのでしょうか....
なお、xx の変わりに @ や [ や ] が単独で入る可能性はあるので、
[^@\[\]]+? は使えません

ちなみに jscript です
0897nobodyさん02/11/07 21:05ID:F/lYrXVu
PHPの書籍で、メールアドレスにマッチさせるとして以下の正規表現が載っていました。
"^([a-z0-9_]|\\-|\\.)+@(([a-z0-9_]|\\-)+\\.)+[a-z]{2,4}$"

"\"がふたつ続いている部分は、意味があるのでしょうか。
"\"をひとつにしてもちゃんとマッチしたのですが…。
0898nobodyさん02/11/07 21:29ID:???
> "\"がふたつ続いている部分は、意味があるのでしょうか。
ある
> "\"をひとつにしてもちゃんとマッチしたのですが…。
気のせい
0899nobodyさん02/11/07 21:53ID:???
>>898 ありがとうございます。

これでもマッチしますた。
<?php
$mail = "a.b-.c@a.b--b.cc";
if(eregi("^([a-z0-9_]|\-|\.)+@(([a-z0-9_]|\-)+\.)+[a-z]{2,4}$",$mail)) echo "yes!";
?>

どんな場合に"\\"が意味を持つのでしょうか。
0900nobodyさん02/11/07 22:04ID:???
>>899
マッチすべきでないものにもマッチしないか?
あくまで稚拙なテストでうまく動いてると言い張るなら勝手にしろ
> どんな場合に"\\"が意味を持つのでしょうか。
そんな場合
0901nobodyさん02/11/07 22:38ID:???
すみませんでした。
"\\"の意味を教えていただけないでしょうか。

正規表現のリファレンスページでは見あたらなかったので、
"\\"というくくり方(捉え方)がそもそも違うのかもしれませんが、
わたしの聞きたいところはご理解いただけないでしょうか。
0902nobodyさん02/11/08 01:21ID:???
"\\"は¥を表す
0903nobodyさん02/11/08 02:00ID:???
わたしの未熟な知識だと、
"\."は"."そのものを表し、"\\."なら"\"と任意のひと文字にマッチする…。
ということになるのですが、>>897の場合は違いますよね…?
どう違うのでしょうか。
0904nobodyさん02/11/08 02:12ID:MLOzQJLM
>890
s{(?:#(.*?)#)|(?:/(.*?)/)}{
"<b>$1</b>" unless $1 eq undef;
"<i>$2</i>" unless $2 eq undef;
}ge;

これだと
#hello/nest#hello/ は
<b>hello/nest</b>hello</i> か。

invalid な HTML 吐かないだけマシって考えてください。
0905 02/11/08 02:52ID:???
"\""="
"\\"=\
"\\."=\.
?
0906nobodyさん02/11/08 03:00ID:1u/BJa8n
***@2ch.net
090789702/11/08 03:57ID:???
えと、905さんの真意は不明ですが、
わたしは905さんとほぼ同じように考えています。
ただし、"\\."だと、"\."という文字列ではなくて、
文字列としての"\X"とか、"\0"とかにマッチする、
つまり、"."は正規表現として扱われるのではないか、と。
そうだとすると、メールアドレスに"\"なんて含まないじゃないか、
なんて思ってしまうわけです。

906さんもヒントなのでしょうか?
***@2ch.netだと、"*"がマッチしないので、ダメですよね。
("\"のときも"\\"のときも)
abc@2ch.netにしてみましたが、当然マッチします。
("\"のときも"\\"のときも)
0908nobodyさん02/11/08 04:03ID:???
"<a href=\"index.html\">" → <a href="index.html">
"\\" → /\/
"\\." → /\./
?
0909nobodyさん02/11/08 08:20ID:???
>>905, >>906, >>908
日本語不自由ですか?
0910nobodyさん02/11/08 08:46ID:???
>>909
FUCK OFF.
0911>>89702/11/08 17:02ID:4bJRaQIX
"^([a-z0-9_]|\\-|\\.)+@(([a-z0-9_]|\\-)+\\.)+[a-z]{2,4}$"ってのはつまり
'^([a-z0-9_]|\-|\.)+@(([a-z0-9_]|\-)+\.)+[a-z]{2,4}$'でしょ?
"^([a-z0-9_]|\-|\.)+@(([a-z0-9_]|\-)+\.)+[a-z]{2,4}$"にしたら
'^([a-z0-9_]|-|.)+@(([a-z0-9_]|-)+.)+[a-z]{2,4}$'になっちゃうから、
たとえば「"@a>aa」などにもマッチするのでは?
091289702/11/08 19:47ID:7pCyPVrI
>>911 ありがとうございます。
えと、無駄なものもあるのかもしれませんが、
$mail = 'a@a>aa';
$mail = '"a@a>aa';
$mail = '\"a@a>aa';
$mail = '"a@a\>aa';
$mail = '\"a@a\>aa';
以上のすべての$mailの場合で、
if(eregi("^([a-z0-9_]|\-|\.)+@(([a-z0-9_]|\-)+\.)+[a-z]{2,4}$",$mail)) echo "yes!";
以上の判別にマッチしませんでした。(yes!と表示されない)

もちろん
$mail = 'a@a.com';
ならマッチします。
091389702/11/08 19:52ID:???
>>911さんがおっしゃりたかったのは、
正規表現として読まれる前の正規表現というか、
"\."をもう一度正規表現として読むと、
正規表現としての"."になってしまう、という意味ですよね。
でも、実際はそういう、二段階で読まれる構成にはなっていないようです。

わかりにくくしか書けなくてすみません。
0914nobodyさん02/11/08 20:52ID:+kBzeIsc
ある文字数制限を越えたら、自動的に切りつめてくれる正規表現を書くにはどうしたら?

たとえば、制限文字数20文字だとして、

http://dailynews.yahoo.co.jp/fc/science/astronomy/

<a href="http://dailynews.yahoo.co.jp/fc/science/astronomy/>
http://dailynews.ya...
</a>

こんなのを考えてるんですが・・・
0915nobodyさん02/11/08 21:37ID:???

ttp://itp.ne.jp/servlet/jp.ne.itp.sear.SCMSVTop
タウンページでの検索結果を
CSVなどの構造化されたデータに変換する最も一般的な手段は
何でしょうか?

ぼくは今まで、w3m -dump →正規表現
と回してましたが、直接HTML読んでCSVなりに変換されている方
いらっしゃいませんか?

0916nobodyさん02/11/08 21:49ID:???
>>915
はげしく外出。>>789,>>800
0917nobodyさん02/11/08 21:50ID:???
>>914
httpなんていう全角のurlがあるとは思われんので
レス不可能。
091891402/11/08 21:53ID:???
ごめん自己解決した。
phpでやってるんですが、

$text = eregi_replace(
"(http://[-_\.!~*'()a-zA-Z0-9;/\?:@&=+$,%#]".
"[-_\.!~*'()a-zA-Z0-9;/\?:@&=+$,%#]?".
"[-_\.!~*'()a-zA-Z0-9;/\?:@&=+$,%#]?".
"[-_\.!~*'()a-zA-Z0-9;/\?:@&=+$,%#]?".
"[-_\.!~*'()a-zA-Z0-9;/\?:@&=+$,%#]?".
"[-_\.!~*'()a-zA-Z0-9;/\?:@&=+$,%#]?".
"[-_\.!~*'()a-zA-Z0-9;/\?:@&=+$,%#]?".
"[-_\.!~*'()a-zA-Z0-9;/\?:@&=+$,%#]?".
"[-_\.!~*'()a-zA-Z0-9;/\?:@&=+$,%#]?".
"[-_\.!~*'()a-zA-Z0-9;/\?:@&=+$,%#]?".
"[-_\.!~*'()a-zA-Z0-9;/\?:@&=+$,%#]?".
"[-_\.!~*'()a-zA-Z0-9;/\?:@&=+$,%#]?".
"[-_\.!~*'()a-zA-Z0-9;/\?:@&=+$,%#]?".
"[-_\.!~*'()a-zA-Z0-9;/\?:@&=+$,%#]?".
"[-_\.!~*'()a-zA-Z0-9;/\?:@&=+$,%#]?".
"[-_\.!~*'()a-zA-Z0-9;/\?:@&=+$,%#]?".
"[-_\.!~*'()a-zA-Z0-9;/\?:@&=+$,%#]?".
"[-_\.!~*'()a-zA-Z0-9;/\?:@&=+$,%#]?".
"[-_\.!~*'()a-zA-Z0-9;/\?:@&=+$,%#]?".
"[-_\.!~*'()a-zA-Z0-9;/\?:@&=+$,%#]?)".
"[-_\.!~*'()a-zA-Z0-9;/\?:@&=+$,%#]*",
'<a href="\0">\1</a>', $text);

こんな感じのでできました。
果てしなくコードきもいけど。
もっとスマートな方法あるんでしょうか。
091991402/11/08 21:56ID:+kBzeIsc
>>917
いや、ほら、
掲示板で半角でhttpって打つと、
勝手にリンクに変換されてうざいじゃないですか。
0920nobodyさん02/11/08 22:22ID:t0LygGS2
>>918=914
{1,20}を使う。後は分かるはず
0921nobodyさん02/11/08 22:25ID:???
>>919
だーからー、
http://dailynews.ya...
は、20文字制限って言ってるのに24文字でしょ、
もしかして、マルチバイト対応での話?
092292002/11/08 22:34ID:t0LygGS2
>>921
だーからー、
本当はソレは半角なんだが、
ここ(2ちゃんねる)では勝手にリンクに変換されてうざいってことでしょう。
092391402/11/08 22:50ID:+kBzeIsc
おー、きもちいいくらいすっきりした。ありがとうです!

$text =
preg_replace("#ftp://([-_\.!~*'()a-zA-Z0-9;/\?:@&=+$,%\#]{1,16})[-_\.!~*'()a-zA-Z0-9;/\?:@&=+$,%\#]*#i",
'<a href="\0">\1</a>',
$text);

>>912 そうです。

できれば、「20文字以上を越えたら"..."つける」っていう機能もほしいな、
とか、思ったりしたり。。。。
0924nobodyさん02/11/08 22:55ID:???
書いてたら先越された・・・
「20文字を超えたら」のところはif文との組み合わせでしょ。
0925nobodyさん02/11/08 23:01ID:???
>>922
だーからー、じゃなかった、
そーれじゃー、
sedとかPerlで
s/(<a href=\")(http:\/\/.............)(.+>)(<\a>)/$1$2$3$2$4/;
かいな。sedでは\1, \2 ...だったけや。

0926nobodyさん02/11/08 23:14ID:???
s{(http://[-\w\./~\%#\@&?]+)}{"<A href=\"$1\">".(length($1)>20?substr($1,0,20).'...':$1).'</A>'}ge;
092791402/11/08 23:32ID:???
(´Д`)PHPだとe修飾子の関数内で後方参照が使えない。。。。

みんなPerl派なのかな。
はて、どうしようか。
092891402/11/09 00:13ID:???
むぅぅ、できた!

function e_modifier($match){
if(strlen($match[0]) > 20){
return "<a href=\"$match[0]\">".substr($match[0],0,20)."…</a>";
}else{
return "<a href=\"$match[0]\">".$match[0]."</a>";
}
}
$text = preg_replace_callback("|gopher://[-_\.!~*'()\w;/\?:@&=+$,%#]+|i", 'e_modifier', $text);

結構ながくなっちったなあ。
それにしても、完結に書ける分Perlはいいなあ。
>>926 さんのやつかっこいいコードです。
0929nobodyさん02/11/09 00:15ID:???
>>928
自分でできるんならいちいち聞くな。
093089702/11/10 11:41ID:???
あの、>>897の質問はもう放置でしょうか…。
やさしーい方が答えてくださるとうれしいです。
すみません、これでダメならもう聞きません。
0931nobodyさん02/11/10 16:03ID:???
その問題は、既に解決しています。
0932nobodyさん02/11/11 20:19ID:sWg+L5qa
$word=~s/AA(\d+)$//;
とすると、数字がないときに$1に変な文字が入るのですが
どうすれば入らないようにできますか。
0933nobodyさん02/11/11 21:43ID:???
if ($word =~ s/AA(\d+)$//) {

}
0934nobodyさん02/11/11 23:45ID:???
>>932
変な文字が入る? 例えばどんな?
0935nobodyさん02/11/12 21:56ID:???
>>934
ソースにない文字なので、ファイルのデータだと思われます。
0936nobodyさん02/11/12 23:51ID:???
my $var = '1';
my $foo = 'A';

$var =~ /(\d)/;
print $1, "\n";
$foo =~ /(\d)/;
print $1, "\n";

1
1

つうことじゃないの?
何で何をどうやってるのかわからんけど。
0937nobodyさん02/11/13 08:12ID:???
>>935がアフォに1票
0938nobodyさん02/11/16 12:23ID:0J3aGqnO
$value =ereg(~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg);

長いと頭がこんがらがって・・・
誰かこの意味を教えてくださいm(_)m
0939nobodyさん02/11/16 12:25ID:0J3aGqnO
間違えた。こうですた。

$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
0940nobodyさん02/11/16 13:10ID:???
16進数?
0941nobodyさん02/11/16 13:20ID:???
意味ったって、16進を10進の文字コードに置換してるだけだろ
0942nobodyさん02/11/16 17:44ID:???
URLデコード
0943nobodyさん02/11/23 02:46ID:LSKuSLu9
ある属性が含まれてるタグのみマッチさせたいってときは
どんな風な正規表現を組み立てたらいいんでしょう?

$attr ='class';

<\s*(?:\w+)(?:\s+(?:(?:$attr\s*=\s*".*?")|(?:\w+\s*=\s*".*?")))+\s*/\s*>

ってやったのですが、これだと

<a href=".."> みたいな属性が指定してあるタグ全部にひっかかってしまいます。
0944nobodyさん02/11/23 09:51ID:???
<\s*(?:\w+)(?:\s+(?:(?:$attr\s*=\s*".*?")|(?:\w+\s*=\s*".*?")))+\s*/\s*>
                         ~~~~~~~~~~~~~~~~~~~
                         ここでマッチしてるんじゃない?
0945nobodyさん02/11/23 10:11ID:LSKuSLu9
>>944
ありがとうございます。
うーん、それを外すと
<a id="index" href=".."> みたいな
他の属性あるとき引っかからなくなりますよね。

とりあえずタグだけひっかけて
それから id が含まれるかどうか
別の正規表現で調べたほうがいいのでしょうか。
0946nobodyさん02/11/23 12:31ID:???
/<(\w+)(?=[^>]*$attr)[^>]*>(?:.*?<\/\1>)?/o;
0947nobodyさん02/11/23 22:14ID:OeWtSfyo
>>946
<a href="ideon">なんかにもかかっちゃわないか??
0948nobodyさん02/11/24 18:08ID:???
/<(\w+)(?=[^>]*\b$attr\b)[^>]*>(?:.*?<\/\1>)?/o;
0949nobodyさん02/11/24 19:01ID:GzYFPBi3
>>948
<a href="id/zero"> だと駄目じゃない。
".." の中を排除しなきゃだめか。
0950nobodyさん02/11/24 22:21ID:???
〜にマッチする、ただし特定の単語は除くという場合どう書いたらいいでしょうか。
Wikiに使うWikiNameで特定の単語は除外したいんですが。

$WikiName = '([A-Z][a-z]+([A-Z][a-z]+)+)';

これで例えば Regularという単語はマッチしないようにしたいんですが。

あと950踏んだので次スレ必要ならば立てますね。
0951nobodyさん02/11/24 22:32ID:???
>>950
それ、Regular にはマッチしないんではないかと。
特殊なページ名にマッチして欲しくないなら
特殊なページ名は増えてくだろうから
マッチしてからきりだして比較のほうがすっきりすると思う。
0952nobodyさん02/11/24 22:47ID:???
しまったぁ。そうですね。
じゃあRegularExpressionsにマッチしないようにしたいと読み替えてください。

マッチしてから比較ですか。どうしようかな。
というのも(PukiWikiなんですが) マッチしたりする部分は深いところにあるので、
自分の技量じゃ改造できそうにないんです。
それでFAQ見たら ttp://pukiwiki.org/index.php?%5B%5BBugTrack%2F146%5D%5D
$WikiNameの正規表現を弄ればいいとなってまして。

次スレ立てますね。
0953nobodyさん02/11/24 23:01ID:???
建てますた。
http://pc.2ch.net/test/read.cgi/php/1038146241/

移行前に>>950の質問にアドバイスくれるとありがたい :-p
0954nobodyさん02/11/24 23:18ID:???
うーん、Wiki の場合そこの正規表現は何度も使われるし、
変に凝った正規表現にしちゃうと
メンテナンス性、速度の二点において不利になるかと。
PukiWiki のサイトでリクエストしてみたら?
指定した単語リストを WikiName として自動認識しない処理がほすい、ぐらいで。
0955nobodyさん02/11/24 23:45ID:???
やっぱそうですよねぇ。

しかしそのリクエストはWikiの存在理由に関わるのでなかなか取り入れてもらえないのです。
過去に数回要望があったみたいなんですが。

しかしプログラミング言語の型名とか(の途中が)勝手にWikiNameになると
気持ち悪くてしょうがないなぁ。
CClassNameとかだとClassNameだけ引っかかっちゃうんですよね。
この場合↑も引っかかるように変えれば気持ち悪くはなくなるのか。
0956nobodyさん02/11/24 23:52ID:???
プログラムのソースの場合、
文脈を読んで WikiName にして欲しいよね。どうせなら。
関数名とか意味あるとこだけ。
ちなみに私は
$WikiName = '([A-Z][a-z]+([A-Z][a-z]+)+)';
による自動マッチ自体不要派です
英語圏じゃ便利かもしれないけど
日本語ではいまいちだし、
今みたいにサイトを作る、っていう目的で運用されることが多い中、
意図しないところでリンクされるのは邪魔でしかない。
それに、PukiWiki はアイデアメモとかそういう方向進んでないし。

ってスレ違いだな・・・。
0957nobodyさん02/11/27 09:56ID:???
スペース(OR Tab)区切りのファイルから値を変数に入れるのに、

@array = /(\S+)/g;
$top=@array[0];
$bottom=@array[1];
$rval=@array[2];
$lval=@array[3];


よりみじかく書けますか?

0958nobodyさん02/11/27 12:32ID:???
($top, $bottom, $rval, $lval)= /(\S+)/g;

配列 @array を再利用するなら
($top, $bottom, $rval, $lval)= @array= /(\S+)/g;
0959nobodyさん02/11/27 16:47ID:YQilorq2
( $top, $bottom, $rval, $lval ) =split /\s+/;
だろう。
0960nobodyさん02/11/27 16:48ID:???
ちなみに、split /\s+/ は最適化されてるらしいから
m 使うより速い(はず)
0961nobodyさん02/12/19 08:48ID:???
他で聞くよりもここで聞いた方が早そうなので聞きます。

【日本語の正規表現】がどうしてもめんどくさい時に
KAKASIなどを使って`テキスト'を【ローマ字の読み】に変換してから正規表現にかけます。

その後、変換された`テキスト'を元の【日本語のテキスト】に
戻すことができればいいのですが、この方法を誰かしりませんか?

KAKASIで変換する際に【漢字⇔読み】の変換テーブルを生成してくれれば
話は楽なのですが、何か良い方法ないないでしょうか?


スレチガイ、スマソ。
0962nobodyさん02/12/19 17:36ID:???
正規表現の基本的な質問を致します。


[^y]は文字の否定ですよね?

「yahoo以外」
という風に

文字列の否定
はどうやるのでしょうか?

0963nobodyさん02/12/19 21:43ID:???
[^(文字列)]
0964nobodyさん02/12/20 10:56ID:???
すみません!!すみません!!

w3m -dump http://www.city.sendai.jp/kankyou/toshisuishin/guide/02/01.html >event.txt
でテキスト化したテーブルを
"┌"
で区切り文字として、テーブル毎に1ファイル生成したいのです。

分割の際は、csplitコマンドを使いたいのですが、こいつはマルチバイトに対応していない
ので、odなどで調べて実際のコードでマッチさせたいのですが、
やり方がわかりません!!

event.txtの中には"┌"が12個あるので、イメージとしては
% csplit -f table_ event.txt /"┌"/ {12}
こんな感じですが、
マルチコードがダメなんで、
% csplit -f table_ event.txt /"『ここにコード』"/ {12}
としたいのです!!

どなたかアドバイス下され!
困っております!

096596402/12/20 10:57ID:???
12個

24個
の間違いでした。
0966nobodyさん02/12/22 18:48ID:JvN7Mbhl
Perl 5 なのですが、マッチした部分を、さらに置換するにはどうすれば良いでしょうか?

$a = "<ul><\/p><p><li><\/li><\/p><p><\/ul>";

$a =~ s/(<ul>.*?<\/ul>)/\1 = s/<\/p><p>//g;/g;

↑こんな書き方はないみたいですけど、なんとなく私のやりたいことは分かってもらえるかと思ったので、ちょっと書いてみました・・・

うまく説明できないのですが、<ul> タグ間にある <p> タグを取り除きたいのです。
なにか良い方法はないでしょうか?
0967nobodyさん02/12/22 18:56ID:???
>>966
<ul>の中の<p>を除去するだけなら
<ul>の中の<p>にマッチする表現を一つ書けばすむんじゃないの?
0968nobodyさん02/12/22 20:56ID:???
そもそも$aってばちゃんと表示してくれるの?
ブロックのネスティングがおかしいように思うけれどんも。
096996602/12/22 22:49ID:JvN7Mbhl
>>967
<ul>の中の<p>にマッチする表現とは、どのように書けば良いのでしょうか?
097096602/12/22 22:51ID:JvN7Mbhl
>>967
<ul>の中の<p>にだけマッチするように表現・・・できますか?

私などでは、まったく分かりません・・・
0971nobodyさん02/12/22 23:39ID:JvN7Mbhl
s/(<ul>).*?<p>.*?(<\/ul>)/\1\2/g;
s/(<ul>).*?<\/p>.*?(<\/ul>)/\1\2/g;

↑こうやる・・・とか ^^; ?
097296602/12/22 23:42ID:JvN7Mbhl
やっぱ駄目か・・・
097396602/12/22 23:45ID:JvN7Mbhl
$a =~ s/(<ul>.*?)<p>(.*?<\/ul>)/\1\2/g;
$a =~ s/(<ul>.*?)<\/p>(.*?<\/ul>)/\1\2/g;

↑これを 100 回くらい繰り返せば、まず大丈夫・・・って、なんてアホな方法 ^^;
0974nobodyさん02/12/22 23:48ID:???
>>970
良く分からんけど
while($text =~ s|(<ul>.*)</?p>(.*</ul>)|$1$2|){1;}
とかループで回してみたり。
一歩間違うと無限ループ直行ですが。
0975v02/12/22 23:51ID:9dxCZgOh
http://yahooo.s2.x-beat.com/linkvp/linkvp.html
097696602/12/23 00:03ID:VBUKjkTD
>>974
あ!なるほど、ループすれば良かったのか!!

どうもです、やってみます。
0977nobodyさん02/12/23 01:06ID:???
perlって$1等で参照を変数のように扱えたんじゃなかったかな?
<ul>が複数あると結局ループを使ってしまうけど。
0978nobodyさん02/12/23 01:29ID:???
$1は定数(read-only)ですがなにか?
レス数が950を超えています。1000を超えると書き込みができなくなります。