トップページ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さん辺りが書いてくれるカモ・・・・
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)ですがなにか?
097997702/12/23 21:51ID:???
いや、$1に代入するんじゃなくて、
<ul></ul>間が取り出せれば一回で済むってことが言いたかったのです。
0980nobodyさん02/12/24 15:29ID:???
なぜPart2よりも上に・・・
0981nobodyさん02/12/24 18:10ID:Hyg/Prvk
え、Part 2 があったの!?
ぜんぜん知らなかった・・・ ^^;
0982nobodyさん02/12/24 18:55ID:YHFX+I6W
0983nobodyさん02/12/24 18:55ID:YHFX+I6W
1000
0984nobodyさん02/12/24 18:56ID:YHFX+I6W
1000
0985nobodyさん02/12/24 19:28ID:???
10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
^^;
0986nobodyさん02/12/25 00:55ID:???
お前ら。今日はクリスマスですよ。こんなことしてていいんですか?
>>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;
レス数が950を超えています。1000を超えると書き込みができなくなります。