正規表現道場@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さん辺りが書いてくれるカモ・・・・
0879878
02/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したものです。
0882878
02/11/05 15:37ID:???それから、僕はタグはw3m -dumpしました。
0883nobody
02/11/05 21:49ID:???これはどう?
while(<>) {
$landscape{$1} = $_ if /\Qランドスケープ研究\E.+?(\d.+)/;
}
foreach $key (sort {$a <=> $b;} %landscape) {
print $landscape{$key};
}
sjisでやるときのために、\Q\E入れますた。
0885nobody
02/11/05 22:38ID:???よかったっすね。
ところで、書き込んでから後で気づいたんだけど、昇順ソートにもかかわらず、
61: 296-298.の方が61: 287-289.より前に来ちゃうのよね。どしてー?
"61: xxx-xxx"の61しか見てないからだよ。
0888nobodyさん
02/11/06 22:30ID:???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>
ってしたいんですけどスマートな解決法ありませんでしょうか?
0893nobodyさん
02/11/07 15:20ID:???29から44までの数字ってどう表しますか?
for(29..44)は使わないで、表現してください。
0894nobodyさん
02/11/07 16:09ID:???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"^([a-z0-9_]|\\-|\\.)+@(([a-z0-9_]|\\-)+\\.)+[a-z]{2,4}$"
"\"がふたつ続いている部分は、意味があるのでしょうか。
"\"をひとつにしてもちゃんとマッチしたのですが…。
0898nobodyさん
02/11/07 21:29ID:???ある
> "\"をひとつにしてもちゃんとマッチしたのですが…。
気のせい
0899nobodyさん
02/11/07 21:53ID:???これでもマッチしますた。
<?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:???マッチすべきでないものにもマッチしないか?
あくまで稚拙なテストでうまく動いてると言い張るなら勝手にしろ
> どんな場合に"\\"が意味を持つのでしょうか。
そんな場合
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:MLOzQJLMs{(?:#(.*?)#)|(?:/(.*?)/)}{
"<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 吐かないだけマシって考えてください。
0906nobodyさん
02/11/08 03:00ID:1u/BJa8n0907897
02/11/08 03:57ID:???わたしは905さんとほぼ同じように考えています。
ただし、"\\."だと、"\."という文字列ではなくて、
文字列としての"\X"とか、"\0"とかにマッチする、
つまり、"."は正規表現として扱われるのではないか、と。
そうだとすると、メールアドレスに"\"なんて含まないじゃないか、
なんて思ってしまうわけです。
906さんもヒントなのでしょうか?
***@2ch.netだと、"*"がマッチしないので、ダメですよね。
("\"のときも"\\"のときも)
abc@2ch.netにしてみましたが、当然マッチします。
("\"のときも"\\"のときも)
0908nobodyさん
02/11/08 04:03ID:???"\\" → /\/
"\\." → /\./
?
0911>>897
02/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>aa」などにもマッチするのでは?
0912897
02/11/08 19:47ID:7pCyPVrIえと、無駄なものもあるのかもしれませんが、
$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';
ならマッチします。
0913897
02/11/08 19:52ID:???正規表現として読まれる前の正規表現というか、
"\."をもう一度正規表現として読むと、
正規表現としての"."になってしまう、という意味ですよね。
でも、実際はそういう、二段階で読まれる構成にはなっていないようです。
わかりにくくしか書けなくてすみません。
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なりに変換されている方
いらっしゃいませんか?
0918914
02/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);
こんな感じのでできました。
果てしなくコードきもいけど。
もっとスマートな方法あるんでしょうか。
0919914
02/11/08 21:56ID:+kBzeIscいや、ほら、
掲示板で半角でhttpって打つと、
勝手にリンクに変換されてうざいじゃないですか。
0920nobodyさん
02/11/08 22:22ID:t0LygGS2{1,20}を使う。後は分かるはず
0921nobodyさん
02/11/08 22:25ID:???だーからー、
http://dailynews.ya...
は、20文字制限って言ってるのに24文字でしょ、
もしかして、マルチバイト対応での話?
0922920
02/11/08 22:34ID:t0LygGS2だーからー、
本当はソレは半角なんだが、
ここ(2ちゃんねる)では勝手にリンクに変換されてうざいってことでしょう。
0923914
02/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:???だーからー、じゃなかった、
そーれじゃー、
sedとかPerlで
s/(<a href=\")(http:\/\/.............)(.+>)(<\a>)/$1$2$3$2$4/;
かいな。sedでは\1, \2 ...だったけや。
0926nobodyさん
02/11/08 23:14ID:???0927914
02/11/08 23:32ID:???みんなPerl派なのかな。
はて、どうしようか。
0928914
02/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 さんのやつかっこいいコードです。
0931nobodyさん
02/11/10 16:03ID:???0932nobodyさん
02/11/11 20:19ID:sWg+L5qaとすると、数字がないときに$1に変な文字が入るのですが
どうすれば入らないようにできますか。
0933nobodyさん
02/11/11 21:43ID:???}
0936nobodyさん
02/11/12 23:51ID:???my $foo = 'A';
$var =~ /(\d)/;
print $1, "\n";
$foo =~ /(\d)/;
print $1, "\n";
1
1
つうことじゃないの?
何で何をどうやってるのかわからんけど。
0938nobodyさん
02/11/16 12:23ID:0J3aGqnO長いと頭がこんがらがって・・・
誰かこの意味を教えてください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:???0941nobodyさん
02/11/16 13:20ID:???0942nobodyさん
02/11/16 17:44ID:???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:???~~~~~~~~~~~~~~~~~~~
ここでマッチしてるんじゃない?
0945nobodyさん
02/11/23 10:11ID:LSKuSLu9ありがとうございます。
うーん、それを外すと
<a id="index" href=".."> みたいな
他の属性あるとき引っかからなくなりますよね。
とりあえずタグだけひっかけて
それから id が含まれるかどうか
別の正規表現で調べたほうがいいのでしょうか。
0946nobodyさん
02/11/23 12:31ID:???0947nobodyさん
02/11/23 22:14ID:OeWtSfyo<a href="ideon">なんかにもかかっちゃわないか??
0948nobodyさん
02/11/24 18:08ID:???0949nobodyさん
02/11/24 19:01ID:GzYFPBi3<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:???それ、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:???変に凝った正規表現にしちゃうと
メンテナンス性、速度の二点において不利になるかと。
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:???@array = /(\S+)/g;
$top=@array[0];
$bottom=@array[1];
$rval=@array[2];
$lval=@array[3];
よりみじかく書けますか?
0958nobodyさん
02/11/27 12:32ID:???配列 @array を再利用するなら
($top, $bottom, $rval, $lval)= @array= /(\S+)/g;
0959nobodyさん
02/11/27 16:47ID:YQilorq2だろう。
0960nobodyさん
02/11/27 16:48ID:???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}
としたいのです!!
どなたかアドバイス下され!
困っております!
0965964
02/12/20 10:57ID:???↓
24個
の間違いでした。
0966nobodyさん
02/12/22 18:48ID:JvN7Mbhl$a = "<ul><\/p><p><li><\/li><\/p><p><\/ul>";
$a =~ s/(<ul>.*?<\/ul>)/\1 = s/<\/p><p>//g;/g;
↑こんな書き方はないみたいですけど、なんとなく私のやりたいことは分かってもらえるかと思ったので、ちょっと書いてみました・・・
うまく説明できないのですが、<ul> タグ間にある <p> タグを取り除きたいのです。
なにか良い方法はないでしょうか?
0968nobodyさん
02/12/22 20:56ID:???ブロックのネスティングがおかしいように思うけれどんも。
0969966
02/12/22 22:49ID:JvN7Mbhl<ul>の中の<p>にマッチする表現とは、どのように書けば良いのでしょうか?
0970966
02/12/22 22:51ID:JvN7Mbhl<ul>の中の<p>にだけマッチするように表現・・・できますか?
私などでは、まったく分かりません・・・
0971nobodyさん
02/12/22 23:39ID:JvN7Mbhls/(<ul>).*?<\/p>.*?(<\/ul>)/\1\2/g;
↑こうやる・・・とか ^^; ?
0972966
02/12/22 23:42ID:JvN7Mbhl0973966
02/12/22 23:45ID:JvN7Mbhl$a =~ s/(<ul>.*?)<\/p>(.*?<\/ul>)/\1\2/g;
↑これを 100 回くらい繰り返せば、まず大丈夫・・・って、なんてアホな方法 ^^;
0974nobodyさん
02/12/22 23:48ID:???良く分からんけど
while($text =~ s|(<ul>.*)</?p>(.*</ul>)|$1$2|){1;}
とかループで回してみたり。
一歩間違うと無限ループ直行ですが。
0975v
02/12/22 23:51ID:9dxCZgOh0976966
02/12/23 00:03ID:VBUKjkTDあ!なるほど、ループすれば良かったのか!!
どうもです、やってみます。
0977nobodyさん
02/12/23 01:06ID:???<ul>が複数あると結局ループを使ってしまうけど。
0978nobodyさん
02/12/23 01:29ID:???レス数が950を超えています。1000を超えると書き込みができなくなります。