正規表現道場@2ch

このエントリーをはてなブックマークに追加
937nobodyさん:02/11/13 08:12 ID:???
>>935がアフォに1票
938nobodyさん:02/11/16 12:23 ID:0J3aGqnO
$value =ereg(~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg);

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

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

$attr ='class';

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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


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


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

「yahoo以外」
という風に

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

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

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}
としたいのです!!

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

965964:02/12/20 10:57 ID:???
12個

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

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

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

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

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

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

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

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

どうもです、やってみます。
977nobodyさん:02/12/23 01:06 ID:???
perlって$1等で参照を変数のように扱えたんじゃなかったかな?
<ul>が複数あると結局ループを使ってしまうけど。
978nobodyさん:02/12/23 01:29 ID:???
$1は定数(read-only)ですがなにか?
979977:02/12/23 21:51 ID:???
いや、$1に代入するんじゃなくて、
<ul></ul>間が取り出せれば一回で済むってことが言いたかったのです。
980nobodyさん:02/12/24 15:29 ID:???
なぜPart2よりも上に・・・
981nobodyさん:02/12/24 18:10 ID:Hyg/Prvk
え、Part 2 があったの!?
ぜんぜん知らなかった・・・ ^^;
982nobodyさん:02/12/24 18:55 ID:YHFX+I6W
983nobodyさん:02/12/24 18:55 ID:YHFX+I6W
1000
984nobodyさん:02/12/24 18:56 ID:YHFX+I6W
1000
985nobodyさん:02/12/24 19:28 ID:???
10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
^^;
986nobodyさん
お前ら。今日はクリスマスですよ。こんなことしてていいんですか?
>>966
sub match{
my($temp) = $_[0];
$temp =~ s/(<p>|<\/p>)//g;
return $temp;
}

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

$a =~ s/(?<=<ul>)(.*)(?=<\/ul>)/&match($1)/eg;
print $a;