正規表現道場@2ch

このエントリーをはてなブックマークに追加
1ヽ(´▽`)ノ
以外と毛嫌いして居る人も多そうな正規表現、
でもperlを使いのなす上で避けて通れない道だったりするかもです。
そこで、スクラップブック的に目に止まったカッコイイ正規表現を
書き留めておこうと言うスレッドです。
質問する時は言語と、得たい結果をなるべく詳しく書いてね。

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

もっとイイ(・∀・) リンクは>>2-10さん辺りが書いてくれるカモ・・・・
2名無しさん@お腹いっぱい。:2001/07/26(木) 09:13 ID:YXyw6YTU
名スレの予感…。
期待age
3_gunzip:2001/07/26(木) 09:16 ID:???
4名無しさん@お腹いっぱい。:2001/07/26(木) 12:33 ID:???
名スレへの期待・・・。
5加奈子:2001/07/26(木) 15:30 ID:???
うふん♪うふふ♪
わたしの魔法で名スレにしちゃうわよん♪(らぶらぶはぁと)

素晴らしい正規表現教えてね♪
すっご〜いの書いてくれた坊やには、ご褒美として
お姉さんが、やさ〜しく、童貞を奪って・ア・ゲ・ル・わよん♪うふ★(はぁと)
6名無しさん@お腹いっぱい。:2001/07/26(木) 16:42 ID:???
foreach (@女友達) {
($輪郭,$目,$鼻,$口,$性格,$髪型,$マンコの臭さ,$締まり,$喘ぎ声) = split(/\t/, $_);

if ($目 =~ /ひとえ/) {
exit;
exit;
exit;
exit;
exit;
exit;
exit;
exit;
exit;
exit;
exit;
exit;
exit;
exit;
exit;
}
}
76:2001/07/26(木) 16:45 ID:???
1人目が一重だったら素敵な出会いを逃してしまう・・・鬱だ逝ってくる
8初心者用:2001/07/26(木) 18:38 ID:rraA5UWo
$hoge = 'ababab';

$hoge =~ s/ab/abab/g;

while( s/ab/abab/ ){}
のヤヴァイ違いを理解すべし。
9名無しさん@お腹いっぱい。:2001/07/26(木) 20:42 ID:???
>>8
それじゃ動かないだろ。
10名無しさん@お腹いっぱい。:2001/07/27(金) 00:07 ID:M7QCgAvY
有限オートマンコ
11名無しさん@お腹いっぱい。:2001/07/27(金) 00:40 ID:???
1の

もっとイイ(・∀・) リンクは>>2-10さん辺りが書いてくれるカモ・・・・

という願いはほぼ崩れ去ったな。気の毒に…
12名無しさん@お腹いっぱい。 :2001/07/27(金) 06:26 ID:???
わははは まぁ良いじゃんまったりいこうや
$hoge =~ s/</</;
13名無しさん@お腹いっぱい。:2001/07/27(金) 10:34 ID:???
>>12 ??
14名無しさん@お腹いっぱい。:2001/07/27(金) 16:33 ID:???
@hoge = m/([0-9a-zA-Z.\-_]{3,20}\@[0-9a-zA-Z.\-_]{5,})/;
15名無しさん@お腹いっぱい。:2001/07/27(金) 17:43 ID:9sLGF54Q
$strings = m/
\s+ | # Space
[\x21-\x7E]+ | # Latin
(?:[\xA1-\xA2][\x00-\xFF])+ | # Symbol
(?:\xA3[\x00-\xFF])+ | # Eisuu
(?:\xA4[\x00-\xFF]|\xA1\xBC)+ | # Hiragana
(?:\xA5[\x00-\xFF]|\xA1\xBC)+ | # Katakana
(?:\xA6[\x00-\xFF])+ | # Greek
(?:\xA7[\x00-\xFF])+ | # Russian
(?:\xA8[\x00-\xFF])+ | # Keisen
(?:[\xB0-\xF4][\x00-\xFF])+ | # Kanji
. # Other
/gx;

EUC-JPの文字列から漢字、平仮名、カタカナ、アルファベットの文字列をブリブリ切り分ける
from perl-oo
16名無しさん。:2001/07/27(金) 18:45 ID:OFQPU1uA
shift_jisの日本語にマッチさせるには?
17名無しさん@お腹いっぱい。:2001/07/27(金) 22:53 ID:???
>>13
$hoge =~ s/</&lt;/;
と書きたかったのだと思われ
18名無しさん@お腹いっぱい。:2001/07/29(日) 13:17 ID:???
$hoge =~ s/クソスレ/良スレ/g;
19名無しさん@お腹いっぱい。:2001/07/29(日) 15:06 ID:???
>>18
気持ちはわかる。願望だ。(w
20出題君@fushianasan:2001/07/29(日) 15:47 ID:hCDIdcLQ
出題
マッタリ、セックス、オナニー を
マターリ、セクース、オナーニ に換える
21名無しさん@お腹いっぱい。:2001/07/29(日) 18:16 ID:???
$hoge =~ s/>>20の出題センス//g;
22名無しさん@お腹いっぱい。:2001/07/29(日) 23:15 ID:1COkoXYs
PerlでHTMLからリンク抜き出すの教えてくだされ。 重複無しで整列して表示したりするのきぼー。
下のは練習に書いてみたやつ。 なぜか最後のprintでコンパイルエラー出まする。

study $html;
$pattern = '<A href="([^"]+)">';
while ( $html =~ /$pattern/is ) {
 $html =~ s/$pattern//is;
 push( @_, $1 );
 print "$1\n";
}
#print "$_\n" foreach(@_);
23:2001/07/30(月) 00:50 ID:tCdJa/Mc
$body =~ s/(<[^>]*\bhref\s*=\s*["']?)([^\s"'>]*)/$1.&url_extract($2)/gie;
foreach (sort keys %URL) {print "$_\n";}
.
.
.
sub url_extract {
my($href) = shift;
$URL{$href}++;
return $href;
}

某スクリプトの一部を拝借
経験上,マッチするごとにサブルーチンに渡した方が早く感じます(何故?

http://schwarzekatz.hypermart.net/test.cgi

そーす
http://schwarzekatz.hypermart.net/test.txt
24名無しさん@お腹いっぱい。:2001/07/30(月) 01:06 ID:???
>>22

#!/usr/bin/perl

use strict;
use HTML::LinkExtor;

my $p = new HTML::LinkExtor;

$p->parse(<<HTML);

HTML

my %link_set;
foreach my $l ($p->links ) {
my ($tag, %link) = @$l;
next if $tag ne 'a';

++$link_set{$link{href}} if exists $link{href};
}

foreach my $link (sort keys %link_set) {
print $link, "\n";
}

__END__

> $pattern = '<A href="([^"]+)">';
> while ( $html =~ /$pattern/is )
> $html =~ s/$pattern//is;

+o
2522:2001/07/30(月) 02:15 ID:???
>>23, >>24
 置き換えする時にサブルーチン呼んだり、ハッシュ使ったり、モジュール使ったりと
いろんな技があるんですね。勉強になりますた。
 大きなのに固定正規表現使う時はoを使うことにします。
 感謝。
26棺@マターリ週間:2001/07/31(火) 00:34 ID:???
>>24

わたすもべんきょうになりますた。感謝ヽ(´ー`)ノ
27名無しさん@お腹いっぱい。:2001/08/02(木) 14:18 ID:???
えっと、ここは質問してもいいんですよね?
激しく定番なのかもしれませんが、

<FOO>
hogehogehogehoge
hogehogehogehoge
hogehogehogehoge
hogehogehogehoge
</FOO>

のパターンようにある文字列Aと文字列Bに*囲まれた部分*
を表す正規表現の王道というのはどんなもんなんでしょうか

なんかやるたびにうまくいったりいかなかったりしてるんで
定番パターンというのがあれば知りたいです。

厨房くさくてスミマセソ
28JAPU@ほえほえ:2001/08/02(木) 14:44 ID:???
m[<FOO>.*?</FOO>]s では?
29名無しさん@お腹いっぱい。:2001/08/02(木) 14:54 ID:???
>>28
はぁ。やっぱ普通そうですよね。。。
ってsオプション?
知らない…調べてきます。

レスさんくすです。
3027:2001/08/02(木) 14:56 ID:???
29=27でした。
ちなみにJAPUタンとタメ歳なのです…。
この違いは…
3127:2001/08/02(木) 15:00 ID:???
>>28
おおお!なるほど。s,m。こんなのがあったんですね。
よさげです。試してみます。ありがとうございます。
32JAPU@スクルド萌え:2001/08/02(木) 15:35 ID:???
通常 "." は [^\n] と等価ですが、"s" 修飾子を付けると "\n" にもマッチするようになりますにゃん。
この辺の説明はらくだ本だとちょっと不親切な気がする。

$_ = "\n\n";
print "moe\n" if /../;
print "hoe\n" if /../s;

>>27
たまたま この分野で、少しだけ詳しいだけなので、
あまり気にしていてはダメよん。
33名無しさん@お腹いっぱい。:2001/08/02(木) 15:51 ID:???
良スレ認定します
34名無しさん@お腹いっぱい。:2001/08/02(木) 16:11 ID:???
&kaere if ( $人間 =~ /^チャンコロ/i );
35名無しさん@お腹いっぱい。:2001/08/04(土) 00:26 ID:b7KA9zTo
みんな、諸説正規表現は、読んでる?
36名無しさん@お腹いっぱい。:2001/08/04(土) 02:38 ID:???
>>22
面白そうなので、自分も作ってみた。
でも、ちょっとしか、テストしてない。
バグでたら、ゴメン。

#!/Perl/bin/MSWin32-x86-object/jperl -w
use strict;

undef $/;

while(<>){
my @urls = m/<a href\s*="(.*?)".*?\/a>/isg;#get url

@urls =sort @urls;#sort

my $prev = 'nonesuch';#uniqu(faqのコード、コピペ)
@urls = grep($_ ne $prev && ($prev = $_), @urls);

print "\n\n -----$ARGV------\n\n" ;
print join("\n",@urls);
}
37初期不良:2001/08/06(月) 01:45 ID:VQtSpJpE
>>28
類似性相似性を見るとむずむずするので
後方参照の例題的なものを利用。

for('FOO', 'BAA'){
 m[<($_)>(.*?)</\1>]s;
 $data{$_} = $2;
}

スレ違いだけどみんな foreach ってわざわざ書くの?
俺は for でいいって聞いてからずっと for なんだが...
わかりにくかったりするかな。
38名無しさん@お腹いっぱい。:2001/08/06(月) 02:38 ID:???
普通はforeach、短いスクリプトだとfor
#foreachは長くて目立つので
39名無しさん@お腹いっぱい。:2001/08/06(月) 11:48 ID:Ij2f2Gkc
oオプション使うと、
mod_perlや、speedycgiで前のパターンが残ってしまいますが、
これの回避方法ってありますか?
40名無しさん@お腹いっぱい。:2001/08/06(月) 12:27 ID:???
>>39
oオプションを使わない
っつか正規表現とは関係ないと思うのだが?
>>38もな
41名無しさん@お腹いっぱい。:2001/08/06(月) 16:43 ID:???
>>40
死きり屋uZeeeeee
42名無しさん@お腹いっぱい。:2001/08/06(月) 21:20 ID:???
>>41
オマエモナー
43名無しさん@お腹いっぱい。:2001/08/12(日) 14:24 ID:???
gオプションでパターンマッチングした際にマッチングした回数が入っている
特殊変数は有りませんか? "$&"がマッチングした文字列みたいなんですが・・・・
本にも $` $' 辺りしか載っていないのです。
他の方法でも大丈夫なのですが、前に何かで見た気がして必死でさがしてる
のですが、見つからないのです  (汁;;
気のせいだったのかなぁ・・・・
44名無しさん@お腹いっぱい。:2001/08/12(日) 14:38 ID:???
my $tmp = "pattern";
my $count = ($tmp =~ s/t/T/g);
print "$count 個の t を T に置換しました\n";

こんな感じ?
4543:2001/08/12(日) 15:23 ID:???
ええっ、、何ですかこれは @_@!!
聞いてみるものだなぁ。。。勉強になりますぅ
今までtでsplitして要素数をみてた馬鹿なおいら  ^^
>>44  ありがとう、もっと精進します
46名無しさん@お腹いっぱい。:2001/08/20(月) 06:59 ID:???
優良スレage
ついでに前に掲示板スレかどっかにあった荒らし制限を載せてみる。
アヒャヒャヒャヒャヒャヒャヒャヒャヒャヒャヒャヒャ
s/(...+?)\1\1+/$1$1$1/;
アヒャヒャヒャヒャヒャヒャ
47名無しさん@お腹いっぱい。:2001/08/20(月) 10:32 ID:???
オプションじゃなくて修飾子ねsage
48名無しさん@お腹いっぱい。:2001/08/20(月) 11:07 ID:???
>>43
ちゃんとした解説本を読んでみよう、ちゃんとのってるよ
49名無しさん@お腹いっぱい。:2001/08/21(火) 02:46 ID:Tv58Rzyg
>>46 最初のしかできないじゃん。
アヒャヒャヒャヒャヒャヒャヒャヒャヒャヒャヒャヒャオヒョヒョヒョヒョヒョヒョヒョヒョヒョヒョヒョヒョヒョヒョヒョヒョヒョヒョ
$char = 2; $repeat = 3;
s/(.{$char,}?)\1{$repeat,}/$1x$repeat/eg;
アヒャヒャヒャオヒョヒョヒョ
50名無しさん@お腹いっぱい。:2001/08/22(水) 03:34 ID:zNoLcpmA
まずオライリーの正規表現本買ってみ
目からウロコ
51名無しさん@お腹いっぱい。:2001/08/22(水) 17:41 ID:B/pBRo0o
>>50
禿同!
鱗どころか、鎧が落ちた気がした。
52名無しさん@お腹いっぱい。:2001/08/22(水) 17:44 ID:???
>>50
ふくろう本ってやつですか?
買って見ようかな、、オークに嵌っている今日この頃 (^_^;
53名無しさん@お腹いっぱい。:2001/08/25(土) 13:20 ID:???
age
54名無しさん@お腹いっぱい。 :01/09/01 00:11 ID:EyspkUdI
良スレあげ、、前に結構マニアックなWEBがあったんだけど
見失っちゃったよ。
sedとかも載ってて薄緑のページ。
確かorgドメインだったかな、、面白いサイトは無いかなー
55名無しさん@お腹いっぱい。:01/09/03 23:49 ID:kJGORBzs
なんちゃってプログラマーです。

たとえば

$Form{comment} =~ s/くそ/●●/g;

とすれば「くそ」と書き込んだコメントを伏字にできますがこれだと
「へたくそ」も「へた●●」となってしまいます。文節に応じた
文字変換(伏字処理みたいなこと)ってどうすればいいんでしょうか。

既出事項であったらすみません。
56名無しさん@お腹いっぱい。:01/09/04 02:02 ID:lxASoDUY
PHPで、strlen($text)とやると、テキスト名のバイト数が返されるくせに
require($text)とやると中味のバイト数が返されるのはなぜだ?
教えろ。
57名無しさん@お腹いっぱい。:01/09/04 23:35 ID:hpdQ0NnY
>>55
なにをどうしたいのさ。
伏せ字でも少し載せて,伏せたいのと伏せたくないのも
載せたほうが答えもらえると思われ。
58名無しさん@お腹いっぱい。:01/09/05 21:06 ID:zThM7aIk
$input = $ARGV[0];
$input =~ s/([.]*)/-----$1-----/; #inputを-----で囲みたいです
print "$input\n";
ってやって、、
$.test.pl 111{}222{}333
ってやると
----------111{}222{}333
こうなります、
-----111{}222{}333-----
何故こうならないのでしょうか、
と言うか目的からは程遠い所なんですが、多分バックトラッキングが理解
出来てないからだと思うのですが。
絶対僕の思ったように動かないに決まってます。
59名無しさん@お腹いっぱい。:01/09/05 21:15 ID:ongErcHE
>>58

$input =~s/(.*)/--------$1---------/;


てゆーか囲むだけなら

$input = '--------' . $input . '---------';

で良いべさ
60名無しさん@お腹いっぱい。:01/09/05 21:27 ID:zThM7aIk
ありがとうです、
えと、それはそうなんですが正規表現の勉強と言う事で (^^
ちなみにevalして
$input =~ s/([.]*)/'-----'.$1.'-----'/e;
こんな風にしても結果は同じなんです。
何か一歩も前に進めない感じで   とほほ
61名無しさん@お腹いっぱい。:01/09/05 22:13 ID:L1KgWH9s
>60
59が答を書いてるだろがゴルァ
.を[]の中に入れたら任意の1文字じゃねーぞゴルァ
62名無しさん@お腹いっぱい。:01/09/05 22:37 ID:mJCW7B8k
>>60
とほほつながりでここでも見て勉強すれ。
http://tohoho.wakusei.ne.jp/wwwperl1.htm#Expr
63名無しさん@お腹いっぱい。:01/09/06 01:36 ID:ji/LQ9h6
ありがとう! 、何だかスレのレベルを一気に下げちゃったみたい
ですけど、 (^^;
しかし上手く動いてくれないんだよなぁ・・・
詳説正規表現って言うのは難しすぎるし
とほほに逝って来ますぅ
64名無しさん@お腹いっぱい。:01/09/06 01:55 ID:Ut37ZYfk
みんな*つかってるけど
(.*)じゃなくて(.+)じゃないの?
65名無しさん@お腹いっぱい。:01/09/06 02:02 ID:jxYvqj8.
>>64
場合による
66名無しさん@お腹いっぱい。:01/09/06 02:07 ID:Ut37ZYfk
>>65
(.*)って,どんな時に使うんですか?
文字に反応しない時がありそうなんで,まったく想像がつかないんですが。
67名無しさん@お腹いっぱい。:01/09/06 06:20 ID:sO/Rg6CI
梅干し食べて酸っぱい時。
68名無しさん@お腹いっぱい。:01/09/06 06:30 ID:jxYvqj8.
>>66

>>62のリンク先ぐらい見てから聞け。
69名無しさん@お腹いっぱい。:01/09/08 10:24 ID:???
(*^o^*)
70名無しさん@お腹いっぱい。:01/09/08 13:08 ID:Lvui7oF6
今日の勉強のおと

正規表現の特殊文字 9連発

. (どっと)
*(アスタリスク)
+(ぷらす)
?(くえすちょん)
[(れふとすくえあ
](らいとすくえあ
`(ばっくくおと
$(だら
\(ばくすらしゅ
71名無しさん@お腹いっぱい。:01/09/08 19:26 ID:???
>70
 大昔backslashをもじった「バクスラ」ってphotonのチームがありましたなぁ

 ちなみに「{」「}」と「<」「>」はどう読んでます?
72名無しさん@お腹いっぱい。:01/09/08 19:47 ID:Lvui7oF6
れふとかーりーぶらんけっと {
らいとかーりーぶらんけっと }
れふとぱーれん (
らいとぱーれん )
73名無しさん@お腹いっぱい。:01/09/09 14:29 ID:NSJpQxzQ
 ○
□+/
 大

どらごんくえすと
74名無しさん@お腹いっぱい。:01/09/09 20:23 ID:???
>72
 どもでした:-)

>73
 ワラタ(笑)
75名無しさん@お腹いっぱい。:01/09/11 12:31 ID:StTUkJnk
任意の2文字以上続く文字
例えば

************************
とか

■■■■■■■■■■■■
とか



****

■■■■

とか短くする正規表現教えてくなさい
76名無しさん@お腹いっぱい。:01/09/11 12:41 ID:???
>>75 >>1のリンクぐらい見てから聞け。

#! perl

$str = '■■■■■■■■■■■■';
$str =~s/(?:■){2,}/■■/;

print $str;
77名無しさん@お腹いっぱい。:01/09/11 18:42 ID:WwJLyJnk
perlって奥深い
78petronius:01/09/11 20:22 ID:???
>>76
「任意の」2文字以上続く文字だろ?
$str =~ s/(.)\1+/$1/g;
79petronius:01/09/11 20:27 ID:???
ああ、■とかのときは $str =~ s/(..)\1+/$1/g; に変えてね。
しかし、これじゃ任意じゃないな。スマソ。
80名無しさん@お腹いっぱい。:01/09/11 21:34 ID:???
じゃあファイナルアンサー

$str =~ s/(.|..)\1+/$1$1/g;
81名無しさん@お腹いっぱい。:01/09/12 02:40 ID:???
ドロップアウト
82名無しさん@お腹いっぱい。:01/09/24 10:09 ID:???
変なスレばっかなので上げっ
詳説買ってきたよ〜 でも難しい  (鬱
83名無しさん@お腹いっぱい。:01/09/25 05:55 ID:I2K.uRSs
英単語の先頭の文字だけを大文字に変換する方法があったら教えてくだされ。
this is a pen

This Is A Pen
とかにしたいの。よろしく〜。
$hoe = join " ", map { ucfirst } split /\s+/, $moe;
...と思ったけど、正規表現スレッドなので、
s/(?<!\S)(.)/uc $1/eg;
としておこう。:-)

# 詳説正規表現は難しいね。
85名無しさん@お腹いっぱい。:01/09/25 12:35 ID:???
>>83

別解で

s/(\w+)/ucfirst $1/eg;
86名無しさん@お腹いっぱい。:01/09/26 00:14 ID:???
s/\b(\w+)\b/\u$1/g
87名無しさん@お腹いっぱい。:01/10/04 15:47 ID:KFx.YrhY
あのお、教えてください。
正規表現でShift_JISの半角カナを全角カナに変換することは
できますでしょうか。
ちなみに最初は下記のようなのを書いてみたけど、Shift_JISの下位バイトに
半角カナに一致するコードが含まれることがあって失敗しました。

%han2zen = ( 'ア'=>'ア', …以下半角=>全角の対応 );
my $re_hankana = '[。-゚]';
my $re_dakuten = '[゙゚]';

#成功例
my $good = "(゚Д゚)ハァ?(゚Д゚)ハァ?";
$good =~ s/($re_hankana$re_dakuten?)/$han2zen{$1}/g;
print "$good\n";

#失敗例
my $bad = "(゚Д゚)ほげ?(゚Д゚)ほげ?";
$bad =~ s/($re_hankana$re_dakuten?)/$han2zen{$1}/g;
print "$bad\n";
8887:01/10/04 15:51 ID:???
上の検証用に半角全角対応ハッシュも書いときます。

my %han2zen = (
'。'=>'。', '「'=>'「', '」'=>'」', '、'=>'、', '・'=>'・', 'ヲ'=>'ヲ', 'ァ'=>'ァ',
'ィ'=>'ィ', 'ゥ'=>'ゥ', 'ェ'=>'ェ', 'ォ'=>'ォ', 'ャ'=>'ャ', 'ュ'=>'ュ', 'ョ'=>'ョ',
'ッ'=>'ッ', 'ー'=>'ー', 'ア'=>'ア', 'イ'=>'イ', 'ウ'=>'ウ', 'エ'=>'エ', 'オ'=>'オ',
'カ'=>'カ', 'キ'=>'キ', 'ク'=>'ク', 'ケ'=>'ケ', 'コ'=>'コ', 'サ'=>'サ', 'シ'=>'シ',
'ス'=>'ス', 'セ'=>'セ', 'ソ'=>'ソ\','タ'=>'タ', 'チ'=>'チ', 'ツ'=>'ツ', 'テ'=>'テ',
'ト'=>'ト', 'ナ'=>'ナ', 'ニ'=>'ニ', 'ヌ'=>'ヌ', 'ネ'=>'ネ', 'ノ'=>'ノ', 'ハ'=>'ハ',
'ヒ'=>'ヒ', 'フ'=>'フ', 'ヘ'=>'ヘ', 'ホ'=>'ホ', 'マ'=>'マ', 'ミ'=>'ミ', 'ム'=>'ム',
'メ'=>'メ', 'モ'=>'モ', 'ヤ'=>'ヤ', 'ユ'=>'ユ', 'ヨ'=>'ヨ', 'ラ'=>'ラ', 'リ'=>'リ',
'ル'=>'ル', 'レ'=>'レ', 'ロ'=>'ロ', 'ワ'=>'ワ', 'ン'=>'ン', '゙'=>'゛', '゚'=>'゜',
'ガ'=>'ガ', 'ギ'=>'ギ', 'グ'=>'グ', 'ゲ'=>'ゲ', 'ゴ'=>'ゴ',
'ザ'=>'ザ', 'ジ'=>'ジ', 'ズ'=>'ズ', 'ゼ'=>'ゼ', 'ゾ'=>'ゾ',
'ダ'=>'ダ', 'ヂ'=>'ヂ', 'ヅ'=>'ヅ', 'デ'=>'デ', 'ド'=>'ド',
'バ'=>'バ', 'ビ'=>'ビ', 'ブ'=>'ブ', 'ベ'=>'ベ', 'ボ'=>'ボ',
'パ'=>'パ', 'ピ'=>'ピ', 'プ'=>'プ', 'ペ'=>'ペ', 'ポ'=>'ポ',
);
89名無しさん@お腹いっぱい。:01/10/04 17:00 ID:???
>>87
jcodeじゃだめか?
ってここは正規表現スレだな
90名無しさん@お腹いっぱい。:01/10/04 22:34 ID:a.Dq8AyI

$hoge =~ s/([\x81-\x9F][\x40-\x7E]|[\xE0-\xEF][\x80-\xFC]|[\xA1-\xDF]|.)/$han2zen{$1} or $1/egs;

いつも通りこう書いたんだけど、$bad はやっぱり上手くいかない。
縦棒って最初にマッチした奴にマッチして終わりじゃなかったっけ?
誰か教えてくれ。
91名無しさん@お腹いっぱい。:01/10/05 04:22 ID:???
>>90
>縦棒って最初にマッチした奴にマッチして終わり
そうだよ。
うえのやつは全角相当のパターンが違うんでないの。
見やすくするためスペース入れると、

×( [\x81-\x9F][\x40-\x7E] | [\xE0-\xEF][\x80-\xFC] | [\xA1-\xDF] | . )
○( [\x81-\x9F\xE0-\xEF][\x40-\x7E\x80-\xFC] | [\xA1-\xDF] | . )

だと思う。少なくとも$badはこれでいけた。
9290:01/10/05 20:50 ID:???
>>91
ああそうかぁ。サンクス。
http://ash.or.jp/ash/tips_prog/htm/code.htm
ココみてパターン書いたんだけど、見方間違えてたよ。

そういえば最後のドットは要らないかな、と思った。
9387:01/10/07 17:56 ID:G6cvoZz6
>>89-92
ありがとー。
9487:01/10/07 18:28 ID:???
まとめ。Shift_JISの半角カナを全角に変換。
my %han2zen = { >>88参照 };
my $re_zen = '[\x81-\x9f\xe0-\xef][\x40-\x7e\x80-\xfc]'; # 全角
my $re_han = '[\xa1-\xdf]'; # 半角カナ
my $re_dak = '[\xde\xdf]'; # 半角の濁点と半濁点

my $s = "(゚д゚)ウマー(゚Д゚)げ?";
$s =~ s/($re_zen|$re_han$re_dak?)/$han2zen{$1} or $1/ge;
print "$s\n";
9587:01/10/07 18:42 ID:???
う。>>94だと"マ゙"が変換されずに残っちゃうです。
>>89-92の人の責任じゃなくて俺のせいっす。鬱だ。。。
9687:01/10/08 01:19 ID:???
よし!これで大丈夫。たぶん。。きっと。。。

# Shift_JISの半角カナを全角に変換する
my %han2zen = { >>88, 'ヴ'=>'ヴ' } # 88のに1コ追加
my $re_zen = '[\x81-\x9f\xe0-\xef][\x40-\x7e\x80-\xfc]'; # 全角
my $re_han = '[\xa1-\xdf]'; # 半角カナ
my $re_dak = '[\xb3\xb6-\xc4\xca-\xce]\xde'; # 半角カナ濁点
my $re_hdak = '[\xca-\xce]\xdf'; # 半角カナ半濁点

my $s = "(゚д゚)ヴマ゙ー(゚Д゚)げ?";
$s =~ s/($re_zen|$re_dak|$re_hdak|$re_han)/$han2zen{$1} or $1/ge;
print "$s\n";
97名無しさん@お腹いっぱい。:01/10/10 00:05 ID:???
apacheで、
ttp://hogehoge/cg\img.jpg
を↓にリダイレクトしたい。
ttp://hogehoge/cg/img.jpg

しかし↓これだと動かない。
RedirectMatch ^/([^\?]*)\\(.*)$ /$1/$2
なぜだか判る?
98名無しさん@お腹いっぱい。:01/10/10 00:06 ID:???
pathに\はおかしいのでは?
99名無しさん@お腹いっぱい。:01/10/10 00:09 ID:???
>>98
しかしIEだとちゃんと表示できるからユーザーは気が付かずに使っちゃうのよ。
他の正常なブラウザだと404になるからリダイレクトしたいの。
10090:01/10/10 01:00 ID:???
mod_rewriteでの記法はよく知らんけど、
最初の ^/ は、 / にしないと駄目でない?
10190:01/10/10 01:04 ID:???
mod_rewriteじゃなかった(恥
102名無しさん@お腹いっぱい。:01/10/10 01:54 ID:???
良く調べた! SIFT_JIS決め撃ちの所で使えるね (・∀・)♪
10397:01/10/10 21:41 ID:???
>>97
RedirectMatch ^/([^\?]*)\\\(.*)$ /$1/$2
なんか知らぬが解決した。
104 :01/10/12 01:11 ID:???
$http_URL_regex=「URLの正規表現」(長いので割愛)

として、掲示板スクリプトの書き込みの中にあるURLに
こうやって自動リンク貼ってる。↓

$data =~ s/($http_URL_regex)/<a href="$1">$1<\/a>/go;

現状だと
http://www.test.com/dir/index.html が
<a href="http://www.test.com/dir/index.html>http://www.test.com/dir/index.html</a> に
置き換わるだけだけど、URL表示の/(スラッシュ)を「<wbr>/」に
置き換えるようにしたい。

具体的には、上の例でいうと
<a href="http://www.test.com/dir/index.html>http://www.test.com<wbr>/dir<wbr>/index.html</a>
って感じにしたい。

一行が長くてゴメソ。分かる人教えて。
105名無しさん@お腹いっぱい。:01/10/12 02:04 ID:???
>>104
分かるもなにも、その$http_URL_regexってやつを
見せてもらわんと。そんなに長いんか?
も、もしかして、大崎氏の「Perlメモ」にある
ものすごい正規表現のことかな。。。
106名無しさん@お腹いっぱい。:01/10/12 02:04 ID:???
>>104
$data =~ s/($http_URL_regex)/&convurl($1)/ge;
sub convurl {
my($url) = shift;
my($str) = qq{<a href="$url">};
$url =~ s|(?<!/)/(?!/)|<wbr>/|g;
$str .= qq{$url</a>};
}

こんなんしか思いつかんダサ
107104:01/10/12 09:48 ID:???
>>105
bingo...
http://www.din.or.jp/~ohzaki/perl.htm#httpURL
にあるやつです。

>>106
うまくいった!ありがとう!
108名無しさん@お腹いっぱい。:01/10/12 12:46 ID:???
<a href="http://www.test.com/dir/index.html>http://www.test.com<wbr>/dir<wbr>/index.html</a>
     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
リンク張るならここまでだろ。2chださい。
109名無しさん@お腹いっぱい。:01/10/12 13:13 ID:???
ちょいテスト

quoteなし
<a href=http://hoge.com/hoge.html>http://hoge.com<wbr>/hoge.html</a>

quoteあり
<a href="http://hoge.com/hoge.html">http://hoge.com<wbr>/hoge.html</a>

quote閉じ忘れ
<a href="http://hoge.com/hoge.html>http://hoge.com<wbr>/hoge.html</a>
110109:01/10/12 13:15 ID:???
>>108 禿しく同意!
111 :01/10/15 01:18 ID:???
112名無しさん@お腹いっぱい。:01/10/15 01:29 ID:???
>>108,109=馬鹿
113名無しさん@お腹いっぱい。:01/10/15 06:28 ID:???
>>112
その心は「クォート閉じ忘れやクォートなしは不正なのに、
それに対応していない2chを批判するのは馬鹿」という理解でよいですか。
114名無しさん@お腹いっぱい。:01/10/15 08:08 ID:???
不正じゃなくても間違えますが何か?
<a href="http://example.com/">http://example.com/</a>
ということでお題。
&は含むけど&lt;や&gt;は含まないように
リンクを張る正規表現は?
115名無しさん@お腹いっぱい。:01/10/15 08:11 ID:???
ちなみに現行はこう。
$message =~ s/(https?|ftp|gopher|telnet|whois|news)\:([\w|\:\!\#\$\%\=\&\-\^\`\\\|\@\~\[\{\]\}\;\+\*\,\.\?\/]+)/<a href=\"$1\:$2\" target=\"_blank\">$1\:$2<\/a>/ig;
116113:01/10/15 09:07 ID:???
>>114
いや、そういう意味で言ってるんだとしたら間違ってるよ。
っていいたかったの。

> &は含むけど<や>は含まないように
> リンクを張る正規表現は?
URLという意味では<が含まれてても問題(よね?)と思うので、
&lt;や&gt;をはじく必要は無いと思うけど・・・
ちょっと考えるよ。
117名無しさん@お腹いっぱい。:01/10/15 09:12 ID:???
すんません。
$116 =~ s/(問題)/$1無い/;
$116 =~ s/</&lt;/g;
$116 =~ s/>/&gt;/g;
118名無しさん@お腹いっぱい。:01/10/15 10:07 ID:???
119名無しさん@お腹いっぱい。:01/10/15 10:08 ID:???
つーか正しく伝わってないかも。
< や > が含まれてると問題あるけど、htmlソース上は
&lt; や &gt; だから含まれてしまうのを
修正したいってことなんだけど。
120113:01/10/15 10:18 ID:???
s/</&lt;/g; s/>/&gt;/g してから
リンク張ってるのがまずいんですね。
リンク張りつつ < > 除去すれば正確になるのかな。

s{
  ((?:https?|ftp|gopher|telnet|whois|news)://[-_.!~*'()a-zA-Z0-9;/?:\@&=+\$,%]+)
  | (<) | (>)
}{
  $1 ? "<a href=\"$1\">$1</a>" :
  $2 ? '&lt;' :
  $3 ? '&gt;' :
  ''
}xeg;
とかはどうですか?
121113:01/10/15 10:37 ID:???
単純に &lt;、&gt; を避けるならこんな感じっすかね?
s{(
    (?:https?|ftp|gopher|telnet|whois|news)://
    (?:[-_.!~*'()a-zA-Z0-9;/?:\@=+\$,%] | &(?![lg]t;) )+
)}
{<a href=\"$1\">$1</a>}xg;
122名無しさん@お腹いっぱい。:01/10/15 11:23 ID:???
news: の場合も // で始まるんでしたっけ?
s{(
(?:(?:https?|ftp|gopher|telnet|whois)://|news:)
(?:[-_.!~*'()a-zA-Z0-9;/?:\@=+\$,%] | &(?![lg]t;) )+
)}
{<a href=\"$1\">$1</a>}xg;
123名無しさん@お腹いっぱい。:01/10/15 11:35 ID:???
URI referenceの場合にもリンクを貼りたいから
s{(
(?:(?:https?|ftp|gopher|telnet|whois)://|news:)
(?:[-_.!~*'()a-zA-Z0-9;/?:\@=+\$,%#] | &(?![lg]t;) )+
)}
{<a href=\"$1\">$1</a>}xg;
124名無しさん@お腹いっぱい。:01/10/15 11:51 ID:???
一般的なCGIなら http と ftp 以外にリンク貼る必要も無いだろうから、
これで十分かな?
s{((?:https?|ftp)://(?:[-\w.!~*'();/?:\@=+\$,%#]|&(?![lg]t;))+)}{<a href="$1">$1</a>}g;
どっちにしても中途半端だけど。
125名無しさん@お腹いっぱい。:01/10/15 12:21 ID:???
oとtarget=_blankを付けてみる。
s{((?:https?|ftp)://(?:[-\w.!~*'();/?:\@=+\$,%#]|&(?![lg]t;))+)}{<a href="$1" target=_blank>$1</a>}go;
126名無しさん@お腹いっぱい。:01/10/15 12:57 ID:???
o修飾子はパターンに変数が入っていないときは影響なしとおもう。
ちがうの?
127名無しさん@お腹いっぱい。:01/10/15 13:01 ID:???
そうかも。
128名無しさん@お腹いっぱい。:01/10/19 22:45 ID:SauUPYVx
正規表現の火を消すな。
129名無しさん@お腹いっぱい。:01/10/20 00:13 ID:???
意味ワカンネーよ  (藁
#詳説買って来たけどかなり本棚の肥やしになりそうな感じ・・・
130名無しさん@お腹いっぱい。:01/10/20 08:13 ID:???
&&&
131名無しさん@お腹いっぱい。:01/10/20 16:58 ID:rS0gfeFk
正規表現って、オミトロンで使ってるマッチングルールと同じ?
132名無しさん@お腹いっぱい。:01/10/20 22:31 ID:???
それはちょっとおかしい。
良く突っ込まれる例:
あめぞうって、2chとかMAGABBSと同じタイプ?
133名無しさん@お腹いっぱい。:01/10/25 02:00 ID:GZ9i4shV
135名無しさん@お腹いっぱい。:01/10/25 17:47 ID:???
136名無しさん@お腹いっぱい。:01/10/25 17:56 ID:???
http://www.2ch.net/----This site is a Japanese famouse WEB site.
137名無しさん@お腹いっぱい。:01/10/26 09:05 ID:+A/kF3WN
何をやりたいんだ
138名無しさん@お腹いっぱい。:01/10/26 11:48 ID:???
</a>までリンクされる現象が直ってるかどうかのテスト、でしょ。
read.cgiでは直ってるみたいね。
139名無しさん@お腹いっぱい。:01/10/26 11:54 ID:???
140名無しさん@お腹いっぱい。:01/10/27 00:02 ID:7lO0RLH0
道場は閉鎖されたようです。
141名無しさん@お腹いっぱい。:01/10/28 01:33 ID:???
移転あげ
あげっ!!
詳説難しいって言う意見が有るけど(確かに ^-^; )
俺は最初詳説買ってチンプンカンプンだったんで、ゆたか氏の正規表現入門を
買ったよ、それから詳説読んだら理解がすすみやすかった
143名無しさん@お腹いっぱい。:01/11/17 19:17 ID:BIcYTt7w
[0-9a-z]++で、8文字までっていうのはどうやるんでしょう?
144吉野家シリーズでいってみよう!:01/11/17 22:44 ID:Sr4+rAbn
そんな事よりちょいと聞いてくれよ。
先日、正規表現のエンジン書いたんです。NFA.
そしたら単語境界の処理とかどうとか聞いてくるんです。
もうね、アホかと。馬鹿かと。
お前な、正規表現で表せねー機能拡張するんじゃねーよ、ボケが。
機能拡張だよ、機能拡張。
なんか文字クラスかあるし。
よーしパパ繰り返し回数指定サポートだー、とか言ってるの。
ここでぶち切れたね。
正規表現はな、状態数有限、男同士でケツを挿すか挿されるか
そこがいーんじゃねーか、状態数爆発させる奴はすっこんでろ。
あのな、E{8}で8回繰り返すなんてきょうび流行んねーんだよ。ボケが。
得意げな顔して何がPerlの拡張正規表現だ。
お前は本当に前処理展開が必要なのかと問い詰めたい。
小一時間問い詰めたい。
145sage:01/11/17 22:57 ID:???
>144
端折らないでちゃんとやってよ〜。
146名無しさん@お腹いっぱい。:01/11/18 00:31 ID:???
>>143
[0-9a-z]{1,8}
147143:01/11/18 02:39 ID:???
ありがうとざいました
148名無しさん@お腹いっぱい。:01/11/18 02:44 ID:???
マジでこれだけだったのか・・・
何かネタかと思ったが
149名無しさん@お腹いっぱい。:01/11/18 03:00 ID:???
>>148 何が?
150名無しさん@お腹いっぱい。:01/11/18 04:31 ID:???
何がって(゜∀゜)! ヒャヒャヒャ
BBSに削除機能付けるから仕方なくって所だな。。。
151ひ‎ろゆき@管‎直人:01/11/18 04:41 ID:???
ワケワカラン
152名無しさん@お腹いっぱい。:01/11/18 13:41 ID:???
>147
「バオー来訪者」に出てきた九官鳥のほうが正しくお礼を言えてるぞ。
153名無しさん@お腹いっぱい。:01/11/18 17:44 ID:???
>>152
オモロイ
154名無しさん@お腹いっぱい。:01/12/12 17:13 ID:???
"c:\Program Files\hoge.exe" "c:\Program Files\hankaku.mp3" "c:\Program Files\全角.mp3"

c:\Program Files\hoge.exe
c:\Program Files\hankaku.mp3
c:\Program Files\全角.mp3
を抽出する方法キボンヌ

m/"\S.*?\S"/g
だと
"c:\Program Files\hoge.exe"
にヒットします.
"なしでヒットする方法キボンヌ(後方参照を使わずに)
155名無しさん@お腹いっぱい。:01/12/12 17:22 ID:9gYD63hd
$hoge =~ s/あめぞう/だめぞう/g;
156名無しさん@お腹いっぱい。:01/12/12 18:22 ID:???
/\w:[^"]+/g でどう?
157名無しさん@お腹いっぱい。:01/12/12 18:35 ID:???
スンバらしい!!
目がうろこ

じゃあ
"hoge\\asdf\"hage"
から
hoge\\asdf\"hage
を抜き出す方法って無い?
158名無しさん@お腹いっぱい。:01/12/12 18:38 ID:???
>>157
そういうファイルがあるってこと?
ファイル名に使えない文字だよ?>"
159名無しさん@お腹いっぱい。:01/12/12 18:50 ID:???
ファイル名じゃなくて単純に文字列です.
160名無しさん@お腹いっぱい。:01/12/12 19:17 ID:???
>>159
じぶんではやろうとしないんだね。。

/(?:").+(?!"\s)/
161名無しさん@お腹いっぱい。:01/12/12 21:16 ID:???
もう出てるのかもしれないけど
foreach my $n (2..100) {
my $number = '1' x $n;
print "$n\n" if $number !~ /^(11+)\1+$/g;
}
「ほう、正規表現でこんなんできんのかいなー」と思ったコードでした。
162デフォルトの名無しさん:01/12/12 22:31 ID:???
正規表現だとめっちゃ遅そうだね  (^ー^;
163名無さん@お腹いっぱい:01/12/12 23:48 ID:3swbdtRp
バックスラッシュでエスケープできる空白で区切られた文字の切り出し。


$_ ='today is monday. tomorrow\ is\ tuesday. I\ hate\ \\\\\\';

while( /\s*((?:\\\S|\\\s|\S)+)\s*/g ){
push( @x, $1 );
}

print join( "\n", @x ), "\n";

切り分けてからバックスラッシュを除去するタイプ。
まとめてやっちゃえないかな。
164名無しさん@お腹いっぱい。:01/12/13 00:07 ID:???
正規表現の起源をさかのぼるとどこまで行きますか?
165名無しさん@お腹いっぱい。:01/12/13 00:10 ID:???
インダス文明
166名無しさん@お腹いっぱい。:01/12/13 00:12 ID:???
>>165
そこまで古くない
167名無しさん@お腹いっぱい。:01/12/13 00:37 ID:???
メソポタミア文明
168名無しさん@お腹いっぱい。:01/12/13 01:30 ID:???
かつてヒッタイト人は正規表現に悩まされ海に沈んだ
>>163

求めているものとは異なると思うけど。
s{\s*((?:\\\S|\\\s|\S)+)\s*}{push @x, $1; $x[-1] =~ s/\G([^\\]*)\\(.)/$1$2/g}eg;
170名無しさん@お腹いっぱい。:01/12/13 07:49 ID:kld8XmGB
>>169
s///の中にs///いれちゃうってのがおもしろい。
級数的に遅くなっちゃうんだろうけど...
171名無しさん@お腹いっぱい。:01/12/13 07:53 ID:kld8XmGB
>>169
二つ目は s/\\(.)/$1/g で良いような。

my %escape = ( n => "\n", r => "\r"... );

s{\s*((?:\\\S|\\\s|\S)+)\s*}{push @x, $1; $x[-1] =~ s/\\(.)/$escape{$1}||$1/eg}eg
172名無しさん@お腹いっぱい。:01/12/13 08:01 ID:kld8XmGB
というか、ようするにタグの属性の'='より後を処理したかったわけで。

# だぶるくおーと
s{\s*"((?:\\[^"]|\\"|[^"])+)"\s*}{push @x, $1; $x[-1] =~ s/\\(.)/$escape{$1}||$1/eg}eg
# しんぐるくおーと
s{\s*'((?:\\[^']|\\'|[^'])+)'\s*}{push @x, $1; $x[-1] =~ s/\\(.)/$escape{$1}||$1/eg}eg

ひとつにまとめたーい
\s*('|")((?:\\[^\1]|\\\1|[^\1])+)\1\s*
うーー。[^\1]って動くのか?
今Perlなし環境なんでためせん....
たしかに s/\\(.)/$1/g で十分っぽい。
何やってるんだろ。

ちなみに、HTMLでは属性値の "..." 内に 「"」を入れたいときには「\"」を
使いません。もちろん、「\n」と書いても改行にはなりません。

あと、欲張りではない .*? とか .+? を使うともう少し簡単に書けそう。
('|") は ['"] と書いた方が微妙に良いかも。

----
どうせなら思い切りトリッキーに
s{\s*((?:\\.|\S)+)\s*}{($x[@x] = $1) =~ s/\\(.)/$1/g }eg;
とか。:-p

# 良く考えたら \\\S|\\\s って \\. ですよね。

そろそろ寝ます。
174名無さん@お腹いっぱい:01/12/13 10:04 ID:MWbyUPNC
>>173
" を使うのが正解なのかな?

<a title="get it from \"snake hole\"">spank spank</a>
<a title="get it from "snake hole"">spank spank</a>

改行を含める場合はどうしたらいいんだろう...

正規表現パート。
('|") と ['"] はどう違うんだろう。
選択と文字クラス(?) の違い?
諸説正規表現あたり読むとわかるんだろうか。

とりあえず、.+? を使って、

\s*['"]((?:\\.|.)+?)\1\s*

にすることにしました。イロイロサンクス!
175名無しさん@お腹いっぱい。:01/12/13 10:05 ID:???
>>174
&quot;を使うのが正解です。
176174:01/12/13 10:59 ID:MWbyUPNC
>>175
あれー? & と quot と ; を書いたはずなんだが... 2ch だと変換されちゃうのか。

もう一個。

今日は(*そりゃもう死ぬほど(ってほどじゃないけど))寒い。

みたいなので、 "(*" から ")" まで一発でマッチさせることって出来ないかな。
ネストしてた場合ってループで処理するしかないのだろうか...
>>174

> 改行を含める場合はどうしたらいいんだろう...

<a title="Mermione
moe">hoehoe</a>

とか。

> ('|") と ['"] はどう違うんだろう。
> 選択と文字クラス(?) の違い?

です。後者の方がバックトラックが発生しないので効率が良いです。
(この場合はそれほど違いは無いですけど。)

>>176

perl5.6以降限定作戦。

$_ = "foo (Hermione (Emma Watson) moe) bar";
$regex = qr/\((?:(??{$regex})|.)*\)/;
($match) = /($regex)/;
print "$match\n";
178174:01/12/13 19:54 ID:???
>>177
そろそろ尊敬しちゃっていいですか?

でも、
% perl -v
This is perl, version 5.004_05..

なので、諦めて寝ます。
ちと訂正。
$regex = qr/\((?:(??{$regex})|.)*?\)/;
($match) = /($regex)/;
こうしないと欲張りマッチになってしまう。

2重まで限定で良ければ、($match) = /(\((?:\(.*?\)|.)*?\))/;
3重まで使いたければ、($match) = /(\((?:\((?:\(.*?\)|.)*?\)|.)*?\))/;
ってのはダメ?
もちろん、(??{ CODE }) 使った方は何重でも使えます。
180ぴこ:01/12/14 02:30 ID:LSCy87gy
 文字列の先頭に有る全角スペース&スペース&改行を
無くすには、どうすればよいのでしょうか?

$piko =~ s/^[.\n\s ]*//g;

 これで無くすと?がHに化けてしまうんです・・・
181名無しさん@お腹いっぱい。:01/12/14 03:06 ID:???
>>180
同じくらいのレベルの俺だけど…
$piko =~ s/^(?:\s| |\n)+//g;
182ぴこ:01/12/14 03:34 ID:LSCy87gy
>>181
 おぉお〜出来ました感動です!
かなり不安でしたが2chに書き込みしてみてよかったです。

 自分の勉強不足が身にしみました
ただ、全角スペースが||で囲まれている理由が
全く分らないのでCGI&Perlポケットリファレンスを
片手に、がばってみます。

 このような質問に丁寧に答えていただき
真に有難う御座いました。
ちなみに、理由は...

$piko =~ s/^[.\n\s ]*//g;
これは、ソースコードが Shift_JIS で書かれている場合、
$piko =~ s/^[.\n\s\x81\x40]*//g;
と等価になります。

で、さらに言うと、

* (いわゆる) 全角スペースは Shift_JIS で "\x81\x40" です。
* Perlでは原則的に文字列をバイト単位で扱います。
* "?" は Shift_JIS で "\x81\x48" です。

頑張ってください。

あと、このままだと先頭の "." まで削除しちゃいます。
# 文字クラス [...] 中では多くのメタ文字はそのメタ性を失うため。

----
あと、本は少し高いけど「プログラミングPerl改訂版」が良いと思います。(
中身はperldoc に全部載っていますが、本の形態である方が最初のうちは何か
と便利です。)
184174:01/12/14 13:56 ID:eAyIvKrj
>>179
やりたいことってのは、
普通の文章の中にあらわれる (...) を切取るって作業なんです。
でも、普通の文章の場合、(...) の中に単体で '(' とか ')' が出ることもあるか...
諦めます。
185名無しさん@お腹いっぱい。:01/12/18 00:11 ID:lPs5lnwv
正規表現で「宣教師と・・・」みたいな(名前忘れた)パズルを解くのが
あるってどこかで見て一度見てみたいんだけどgoogleで調べても出てこない。
だれか、コード or コードを載せてあるページ知ってる人いない?

恥ずかしながら、どうやって解いているのか見当もつかない。
186名無しさん@お腹いっぱい。:01/12/18 00:31 ID:???
恥ずかしながら、何を言っているのか見当もつかない。
187名無しさん@お腹いっぱい。:01/12/18 00:39 ID:???
>>186
人食い族と宣教師がボートに乗って川を渡る
とかいうやつじゃないの?
188名無しさん@お腹いっぱい。:01/12/18 01:14 ID:???
>>186
スマン。
問題書いてなかったね。

3 人の宣教師と 3 人の人喰い土人が川の左岸にいます.
1 隻の 2 人乗りボートを使って,
右岸に渡るにはどうすれば良いでしょうか?
ただし土人の人数が宣教師の人数よりも多くなると,
宣教師は喰われてしまいます

という問題。
189名無しさん@お腹いっぱい。:01/12/18 01:52 ID:???
>>187 >>188 ぁ、わかった。けど、肝心のサイトを知らないな…。
190名無しさん@お腹いっぱい。:01/12/18 02:36 ID:???
http://pc.2ch.net/test/read.cgi/php/991313362/
でプログラム技術板で解いてたとか。(18,52あたり)
ちょっと違う問題っぽいけど。
肝心のムの板スレは見つからず・・・
191190:01/12/18 02:41 ID:???
ムの板スレ・・・ → ム板のスレ
192名無しさん@お腹いっぱい。:01/12/19 00:58 ID:???
>>190
おもしろそうだから探してみたけど見つからなかった (-v-;
正規表現のコンパイラを上手く使って分岐するのかな?
と言うかこの問題ニ分木で解いたけど難しかった。。。
193名無しさん@お腹いっぱい。:01/12/19 19:57 ID:iZmRvdOP
アクセスログ解析でUserAgentを見てみるとあきれるほどMSIEのバージョン違いが多くて
まとめようと思いました。IEのバージョンとwinのバージョン以外は無視するつもりで
/MSIE.*5\.5.*Windows.*98/
とやっても
Mozilla/4.0 (compatible; MSIE 5.5; Windows 98; Win 9x 4.90)
Mozilla/4.0 (compatible; MSIE 5.5; Windows 98)
などにマッチしてくれません。正規表現道場の師範の方々にご教授願いにあがりました。

環境はActivePerl(perl5.6.1 built for MSWin32-x86-multi-thread) on Windows2000proです。
一応分け方としてはMSIE5.01, 5.0, 5.5, 6.0とWindows 95, 98 ,NT5の組み合わせを
考えています。

#それにしてもヴァージョン違いの多さにあきれてしまいます。そういえばMeがでてきません。
#98の3rdエディションともでていなかったけど
194名無しさん@お腹いっぱい。:01/12/19 20:11 ID:1HBNd19Z
>>190
最短は何手なの?
自分も解いてみたけど13手だった。
>>193
マッチしますが?
196名無しさん@お腹いっぱい。:01/12/19 21:53 ID:FzZSVld0
>193
コーディングの問題でした。
処理が下に抜けていた。

修行し直します。
197名無しさん@お腹いっぱい。:01/12/20 17:08 ID:???
ある正規表現にマッチするような文字列を自動生成する方法ってなんかある?
例えば、/\d+/とかだったら、0、/\d+\w+/だったら、0aとか。
一般的には無理です。
コンパイラを書く、で、途中で挫折これ最悪(って訳でも無い,,)
200名無しさん@お腹いっぱい。:01/12/20 23:46 ID:dNXMf8EI
>>188
ちょっと違うけど。

問題クレクレ
http://piza.2ch.net/tech/kako/989/989687023.html

船渡し問題
http://piza.2ch.net/tech/kako/990/990503990.html

スクリプト
$_='i=FMBBGGSD;@n=(F,M,B,G,S,D);Yp{_X!(/D/&!/S/&/[^D]/|/F/&/G/&!/M/|/M/&/B/&!
/F/)}Yz{_X!_|/[FMS]/}Yr{aXbXp(a)&p(b)&p(a.b)&z(b)}Yt{my(@o,c,d,e,f,g,h,i,j);c=k
%2;e=iXf=jXif(c&!f){push@m,join"\n",@l,k,"";return}_=e;y/FB/MG/;return if Z&Z<=
k;Z=k+1;@o=(@n,"");for g(@n){shift@o;for h(@o){e=i;d=g.h;f=j.d;next if e!~s/g//
|h&e!~s/h//|!r(e,d);a="e->d j";a="j d<-e"if c;push@l,a;k++;t(f,e);k--;pop@l;}
}}t i;print@m,@m+0';s/X/=shift;/g;s/Y/sub /g;s|Z|\${c}{join"",sort split//}|g;s
/[|&]/$&$&/g;s/\b[_-k]\b/\$$&/g;eval
201名無しさん@お腹いっぱい。:01/12/21 02:38 ID:???
やっぱ無理か。
202185:01/12/21 03:29 ID:???
>>200
おお、どうもありがとう。
こっちの船渡し問題は昔Cでhash使って、最短手数出るように
解いたんだけど、このスクリプトもちゃんと同じ17手になるんだね。


しかし、見にくいコード・・・。
203174:01/12/21 06:58 ID:???
>>197
ああ、それたまに欲しくなるよね。

$pattern ="hogehoge";

$dummy =/^${pattern}_[Gg][Ee][Tt]\s*=\s*(.*)/;

while( // ){
...
}

$patterm も case を ignore してほしいのよ。

素直に i つかえばいいんだろうけどさぁ...
204174:01/12/21 07:00 ID:???
>>203
ああ、ちょっと違う。

$pattern ="[Hh][Oo][Gg][Ee][Hh][Oo][Gg][Ee]";

だった。

んで、$dummy をどうするかって話...
>>203
何が言いたいのか良く理解できないので、想像して書きます。

$pat = "abc"; のとき、/${pat}de/ で "ABCde" も受理されるようにしたいっ
てこと? それなら/(?i:$pat)de/ とかいう感じで。(The letters between ? and
: act as flags modifiers, see the (?imsx-imsx) manpage.)

繰り返しになるけど、ある正規表現が受理する文字列は無限に存在する可能性
があるので、正規表現 => 受理する文字列を全て見つける は不可能だよ。正
規表現じゃなくて単純なパタンならある程度可能だけどね。
# 単純な例として、// とか /moe/ とかの場合考えると分かると思う。

とりあえず、>>203 は分かりやすい日本語でも書いてろってこった。
206名無しさん@お腹いっぱい。:01/12/21 08:15 ID:???
>>203
の言ってることは意味不明だけど、>>197は「全て」とはひとことも
書いてない。一つだけでいいんだろ。

とりあえず、JAPUは脳内変換やめろってこった。

>>197
できないことはないだろうけど、正規表現パースして解析して
とかカナーリめんどくさいことになりそう。
パースして解析してってのは脳内長島用語ですか?
208名無しさん@お腹いっぱい。:01/12/21 08:53 ID:EZ0rO4Ln
( ´,_ゝ`)   ・・・
209名無しさん:01/12/21 09:32 ID:???
( ´,_ゝ`)   ぷ
210名無しさん@お腹いっぱい。:01/12/21 09:33 ID:???
197みたいなのを作るのは面白そうだね。
学生さんの冬休みの自由研究としてちょうどいい分量かも。

1. 正規表現をparseしてオートマトンを作る。
2. オートマトンからゴールに向かって状態を遷移させていく。(無限ループに注意)

みたいな感じか。

1で作るオートマトンでのNFAとDFAの比較、2で最短の解を求めるアルゴリズム
なんかを考察してみるのも楽しそう。
211名無しさん@お腹いっぱい。:01/12/21 09:37 ID:???
197です。

perlはあまり使ったことがないので、203さんの言ってることは
ちょっとよくわかんないんですが、

全てヒットする必要はありません。
一個でもヒットする文字列ができればいいんです。

if ($str =~ /\d+/) {
}
とかあったときに、ifが成立するようなstrを生成したいというだけなので、
全ては必要ないですし、長さが最低でなければならないというわけでもありません。

>>206
自分でもいろいろ考えた結果、自分でパースするしかないかと思い
かなりめんどくさそうだったので、もしかしたらなんかいい方法あるかも?
とか思い質問したんですが、やっぱ地道な方法しかありませんか……
212名無しさん@お腹いっぱい。:01/12/21 09:38 ID:???
>>207
脳内長島用語って脳内長嶋用語のことですか?
213名無しさん@お腹いっぱい。:01/12/21 12:42 ID:???
>>211
仕様が曖昧すぎるな
もう少し簡単に絞ればいくらでも実現方法はあるだろ
214名無しさん@お腹いっぱい。:01/12/27 00:04 ID:8/UHgYLF
良スレあげ
http://123http://456http://789
↑ 1つのURLに… 笑!
215名無しさん@お腹いっぱい。:01/12/27 01:29 ID:???
かっこわるいね
216名無しさん@お腹いっぱい。:01/12/27 02:16 ID:???
>>214
よく意味が判らないのですが...
偏執クンだよ w
218名無しさん@お腹いっぱい。:01/12/27 08:38 ID:???
219名無しさん@お腹いっぱい。:01/12/27 19:20 ID:???
意味わからなくてヨーソロ
220わかれ:01/12/28 00:50 ID:???
http://teri.2ch.net/test/read.cgi/bobby/1008921769/
http://tmp.2ch.net/test/read.cgi/kitchen/1009247793/

http://1.              ??
http://1.              ??
http://1.              ??
http://1.              ??
http://1.            ??????
http://1.          ??????????
http://1.      ??????????????????
http://1.    ??????????????????????
http://1.  ??????????????????????????
http://1.??????????  ??????  ??????????
http://1.????????  ??  ??  ??  ????????
http://1.????????  ??  ??  ??  ????????
http://1.??????????  ??????  ??????????
http://1.??????????????????????????????
http://1.  ??????????????????????????
http://1.      ??????????????????
221test:01/12/28 00:51 ID:???
http://www. ヾ     ∧∧
http://www.  ゝ′ ̄( ∀)
http://www.   UU ̄U U
222名無しさん@お腹いっぱい。:01/12/28 00:58 ID:???
>AA
青くなってないぞ・・・。
223名無しさん@お腹いっぱい。:01/12/28 01:11 ID:???
ね、残念
フォームの中では絵になってたよ(w

↓こっちで楽しんでくれ
http://tmp.2ch.net/test/read.cgi/kitchen/1009247793/
224名無しさん@お腹いっぱい。:01/12/29 02:13 ID:???
http://www..ヾ     ∧∧
http://www...ゝ′ ̄( ∀)
http://www......UU ̄U U
225名無しさん@お腹いっぱい。:02/01/05 04:37 ID:jzyBr8o2
文字列と数字が混ざってるのを分離するうまい正規表現を教えてください。
226名無しさん@お腹いっぱい。:02/01/05 05:25 ID:???
>225
よく意味がわからないなあ。
たとえば"14giko9mona033zonu7:@dd+i100"を、"14","giko","9","mona","033","zonu","7",":@dd+i","100"
に分割したいってこと?
227名無しさん@お腹いっぱい。:02/01/05 12:22 ID:0tAKedaD
>>226
よくわからんけど、例えの労力に感動。
「ちがいます」の一言で終わりそうだけど。
たとえば・・・てのは、質問者がやらなきゃいけないことでしょう?(笑)
228225:02/01/06 03:54 ID:Ts5foqO9
>>226
その通りです!
例えば…を書かなくてすみません。お願いします。
229名無しさん@お腹いっぱい。:02/01/06 04:16 ID:???
wakata
imakara
tukuruyo
mattetene
230229:02/01/06 04:42 ID:???
@mozi = (a..z);
$mozi = join("", @mozi);
@suzi = (0..9);
$suzi = join("", @suzi);

$data = 'abc940ab?!あkcc873ilo';
$naga = length $data;

for (0..$naga) {
$base = substr($data, $_, 1);
if ($mozi=~$base) { $char = 'mozi'; }
elsif ($suzi=~$base) { $char = 'suzi'; }
else { $char = 'hoka'; }
if ($oldchar eq $char) { $form[$#form].=$base; }
else { push(@form, $base); }
$oldchar = $char;
}

print "Content-type: text/html\n\n";
print join("<>", @form);

できた。
231225:02/01/06 04:49 ID:ksFrDwl4
>>230
ありがとうございます。まずコードを読んで勉強します。
でも、正規表現でもっとスマートにはできないでしょうか?
やはり、これくらいコードを書かなきゃだめですか
232名無しさん@お腹いっぱい。:02/01/06 05:18 ID:???
これでどう? >>226のヤツ
$giko = '14giko9mona033zonu7:@dd+i100';

@kazu = $giko =~ /(\d+|\D+)/g;
$moji .= '"' . join('","' , @kazu) . '"';
print "$moji\n";
233名無しさん@お腹いっぱい。:02/01/06 05:26 ID:???
わわ…
○ $moji =
× $moji .=
234ダメ男:02/01/06 05:27 ID:EPBlOzfD
>>225

;### これでどうでしょう?
$_= '012abc$%@987ABC/=!';
$SEPA= '^K';
s/(\d)(\D)/$1$SEPA$2/g;
s/(\D)(\d)/$1$SEPA$2/g;
s/(\w)(\W)/$1$SEPA$2/g;
s/(\W)(\w)/$1$SEPA$2/g;
for ( split(/$SEPA+/) ){
  print $_,"\n";
}
235名無しさん@お腹いっぱい。:02/01/06 06:03 ID:???
これだけでも出来た…。
$giko = '14giko9mona033zonu7:@dd+i100';
print '"' . join('","' , $giko =~ /\d+|\D+/g) . '"';
236226:02/01/06 06:52 ID:???
俺も書いてみた。
たとえば数字とそうでないものとに分けて2つの配列に格納したい場合。

my $str = '14giko9mona033zonu7:@dd+i100';
my @num;
my @notnum;
($1) ? push(@num, $1) : push(@notnum, $2) while $str =~ /(\d+)|(\D+)/g;

"033"の先頭の0をこの段階で取り除いて、数値として @num に格納したいのなら、
$1 の箇所は $1 + 0 に変更だね。
237ダメ男:02/01/06 06:53 ID:n1rLEP+p
>>235

;### 1行で書くと↓のようになります。(ピリオドで連結しないでカンマで区切って出力したほうが処理が速い)
print '"',join('","' , ($giko= '14giko9mona033zonu7:@dd+i100')=~ /\d+|\D+/g),'"';
238名無しさん@お腹いっぱい。:02/01/06 07:08 ID:???
>>235
それだと、もはや$gikoに意味が無いような…。これと同じ。
print '"',join('","' , '14giko9mona033zonu7:@dd+i100' =~ /\d+|\D+/g),'"';
239238:02/01/06 07:10 ID:???
間違えた
>>237
× >>235
240ダメ男:02/01/06 07:34 ID:rx7aYtfj
;### 新たに作ってみました。
$_= 'aa14giko9mona033zonu7:@dd+i100';
$SEPA= "\033";
s/((\d+)|(\D+))/$1$SEPA/g;
for ( split($SEPA) ){
  @catch= (@catch, $_); ## または push(@catch, $_);
}
241ダメ男:02/01/06 07:39 ID:GkL31czH
>>240 自己レス

;### 不要なカッコを書いていました。
s/((\d+)|(\D+))/$1$SEPA/g;⇒s/(\d+|\D+)/$1$SEPA/g;
242ダメ男:02/01/06 07:51 ID:7uRhBz8j
;### 236を改造してみるとこうなります。
my $str= '14giko9mona033zonu7:@dd+i100';
push(@catch, $1 ? $1 : $2) while $str=~ /(\d+)|(\D+)/g;
243名無しさん@お腹いっぱい。:02/01/06 16:36 ID:???
>>235
で一番シンプルな解が出てるのに延々続いてるのはなぜ?
@catch = ( $str =~ /(\d+|\D+)/g );
244243:02/01/06 16:37 ID:???
間違えた。
@catch = ( $str =~ /\d+|\D+/g );
245225,231:02/01/07 03:24 ID:9HzJI0rF
>>232-244
いろいろな書き方があるのでとても勉強になりました
たくさんの方々、本当にありがとうございます^^
246名無しさん@お腹いっぱい。:02/01/09 01:40 ID:Guhk8J3C
良スレ認定。
247名無しさん@お腹いっぱい。:02/01/11 16:12 ID:???
40あげ
248名無しさん@お腹いっぱい。:02/01/13 14:15 ID:???
良スレだとは思うけど、WebProgとは直接関係ないし。
なぜプログラム板にスレを立てなかったか問い詰めたい。
249名無しさん@お腹いっぱい。:02/01/13 20:08 ID:???
>>248
そんなことないでしょ?
Perlだってhttpd.confだっておけらだってあめんぼだって
みんなみんな生きているんだ。
ていうか、WebProg意外に正規表現使わない人だって結構いますから。
250(・∀・)!! 1:02/01/13 21:15 ID:???
>>248
いや、それがですね旦那、旦那みたいな方ばっかりなら良いんっすけどね
あっちもアレな人が増えてきたんで、
正規表現 → 氏らねー → Perlじゃネーカ?? → よっしゃ煽ったろ
みたいになって荒れるより、こっちで静かに余生を送りたいなと思ったんすよ

// 試しにたててみます?  ^^;;
251名無しさん@お腹いっぱい。:02/01/13 21:32 ID:???
>>250
試しに立ててみましたみたいな立て方すると、結果が予見できる・・・(笑)
252(・∀・)!! 1:02/01/13 21:48 ID:???
= 予想された展開 =
普通の人:どの言語でも良いの?、それともオートマトンとかエンジンの話するの?
  ↓
R**y屋さん:正規表現も積んでない言語は糞!!p**lはもっと糞!!r**y!!!
  ↓
D**phi屋さん:ハァ??ライブラリ使えば良いだろ?R**y逝ってよし!
  ↓
R**y屋さん:でるphなんか使うやしはあふふぉf R**y!!!!>>>>>>>D**phi

以下糞スレを増殖しつつ、無限ループ 

// 嫌すぎます・・
253名無しさん@お腹いっぱい。:02/01/13 23:04 ID:???
>>252
いや、Perlでいいじゃんとか。
PHP・・・とか書いて放置されるとか、
漢はshつかえとか、入り乱れてのバトルロワイヤル。

でもないか。
254248:02/01/14 23:31 ID:???
なるほど、たしかに使用言語がらみの厨な応酬が起きそうで嫌ですね  >ム板
スクリプト言語だと特に。

そこまで考えてませんでした。やぼなツッコミしてすみませんです。
255名無しさん@お腹いっぱい。:02/01/15 01:35 ID:/IL06s2P
2ちゃんとかで引用に使われる">>"を判別して自動リンクつけたいんですが、

$text = ">>2は逝ってよし!";
$text =~ s/>>[0123456789]{1,3}/<a href="">$&<\/a>/g;

ココまではできたんですが、アンカーのURLに引用もとの数字を入れたいんですが
(この場合だと"2")、それをどう取得したらよいか分かりません。
この正規表現の書き方では無理ですか?
256名無しさん@お腹いっぱい。:02/01/15 02:47 ID:???
$_ = q|>>255は逝ってよし!|;
s#>>(\d+)#<a href="http://pc.2ch.net/test/read.cgi/php/996105815/$1">$1</a>#g;
print;
257名無しさん@お腹いっぱい。:02/01/15 02:58 ID:???
$_ = q|>>256修正|;
s#>>(\d+)#<a href="http://pc.2ch.net/test/read.cgi/php/996105815/$1">$&</a>#g;
print;
258255@へたれ正規表現:02/01/15 03:03 ID:???
>>256,>>257
ありがとうございます。
ここでつまってて、もう文字列解析しようと思ってました(藁
259名無しさん@お腹いっぱい。:02/01/18 15:45 ID:DsGDZg+9
もの凄く基本的な事のような気がして恐縮なのですが、
「文字Aが含まれる行」は正規表現でどのように書くのでしょうか?
Aが含まれる行を全て削除(又は置換)したいんです。
260名無しさん@お腹いっぱい。:02/01/18 15:50 ID:OQbDLabT
/.*ё.*/´д`/
261 ◆AskaRoYg :02/01/18 20:49 ID:???
open(FILE,"+<$file");
@data = <FILE>;

map {
if ($_=~/A/) { $_=''; }
} @data;

seek(FILE, 0, 0);
print FILE @data;
close(FILE);
----------------------------
なんか間違ってたら直して
262名無しさん@お腹いっぱい。:02/01/18 21:48 ID:???
なんも間違ってないけど、明らかに間違ってるな。
263259:02/01/19 02:06 ID:???
頼むぜ、ブラザー。
264名無しさん@お腹いっぱい。:02/01/22 02:11 ID:hOKQ9mVE
while(<>){ print unless m/A/ }
265名無しさん@お腹いっぱい。:02/01/31 17:52 ID:???
\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*

メールアドレスの入力チェックなんだけどどーゆー意味?
266名無しさん@お腹いっぱい。:02/01/31 23:21 ID:XvhUBoWr
$str = '<font size="5">冬は"寒い"。</font>夏は"暑い"。';

この<と>に囲まれてない部分の"だけ("寒い"と"暑い")
"に変換するには正規表現でどう書くんでしょうか?

$str =~ s/>(.*?)"(.*?)</>$1"$2/g;
と書くと2個目の"が変換されませんでした。
267名無しさん@お腹いっぱい。:02/01/31 23:23 ID:XvhUBoWr
変換されてしまった。訂正です。

> "に変換するには正規表現でどう書くんでしょうか?

> &quot;に変換するには正規表現でどう書くんでしょうか?
268 ◆7P5EE/DI :02/02/01 00:08 ID:???
>>261
とりあえず気が付いたことだけ。

1. 繰り返し処理``だけ''を行いたいならgrepやmapではなくforeachを使うのがよろし。
2. データの一部が削除されているので、truncateしてやらんと末尾にゴミがくっ付いてしまう。
269名無しさん@お腹いっぱい。:02/02/01 01:10 ID:???
>>266
$str = '<font size="5">冬は"寒い"。</font>夏は"暑い"。';

こんなのしか考えつかない…。正規表現一発で出来るの?偉い人〜
foreach (split /(<[^>]+>)/,$str) {
    !/</ and s/"/&quot;/g;
    print;
}
270266:02/02/02 01:23 ID:YNNMuvTz
>>269
ありがとうございます。
そこから考えて、汚いですがとりあえずこんなので解決しました。
while ($str =~ s/>([^<]*)"/>$1"/g or $str =~ s/"([^>]*)</"$1</g) {}

もし正規表現一発で出来る方法があったらよろしくお願いします。
271初心者:02/02/02 03:29 ID:oZiG+SwX
$str =~ s/\"/&quot\;/g; $str =~ s/<([^\>]*)=&quot\;(\w)&quot\;([^\>]*)>/<$1=\"$2\"$3>/g;

じゃだめなのか。
272名無しさん@お腹いっぱい。:02/02/02 03:58 ID:???
URLとかスタイルシートがあるからだめだろうね -> \w
273 ◆7P5EE/DI :02/02/02 06:05 ID:???
一行だけど、なんだか。
こんなんしか出来ませんでした。

$str = join '', map { /^</ or s/"/\@/g; $_ } split /(<[^>]*>)/, $str;
274 ◆7P5EE/DI :02/02/02 06:06 ID:???
訂正。
$str = join '', map { /^</ or s/"/"/g; $_ } split /(<[^>]*>)/, $str;
275名無しさん@お腹いっぱい。:02/02/03 19:17 ID:???
正規表現より良い表現(マッチ方法)って無いの?
276名無しさん@お腹いっぱい。:02/02/04 03:27 ID:???
マッチョ法ってのがあるよ。
277名無しさん@お腹いっぱい。:02/02/04 03:37 ID:???
>276
それどんなかんじ?
278あぼーん:あぼーん
あぼーん
279名無しさん@お腹いっぱい。:02/02/04 06:14 ID:???
>>277
ぐぐーるしてください。
280名無しさん@お腹いっぱい。:02/02/04 10:37 ID:6Yw0Bfwo
>>275
これなんかどうよ?
文脈依存文法表現案
http://www.try-net.or.jp/~yoji/idea/gramagic/codgex.html

まだ案だけど、これが完璧になれば、圧縮ファイル中の html ファイルの
a 要素の href 属性の中で 2ch に関係してるものを検索、
とか出来るようになるのかな。まだ案だけど。
281名無しさん@お腹いっぱい。:02/02/15 04:54 ID:???
>>278は何?
282名無しさん@お腹いっぱい。:02/02/15 07:48 ID:???
マッチョ法age
283268:02/02/16 21:03 ID:???
あ・・・そうだ・・・ありがとう。
284名無しさん@お腹いっぱい。:02/02/28 01:43 ID:xJe5pzKX
半角スペースは\sでいいんでしょうか?
複数スペースを一個にしたいので
$string =~ s/\s+/\s/g;
とやったらうまくいきません。ていうか
$string =~ s/\s/test/g;
とやっても半角スペースに反応しなかったんですけど、\sの理解が間違ってますか?
宜しくお願いします。
285名無しさん@お腹いっぱい。:02/02/28 01:50 ID:???
tr/\x20\x09/ /s;
286名無しさん@お腹いっぱい。:02/02/28 01:52 ID:xJe5pzKX
ああ、やっぱりそういうややこしいのになっちゃうのね。ありがとう。
ちなみにどうして284のは間違ってるんですか?
287名無しさん@お腹いっぱい。:02/02/28 01:53 ID:???
>284
2番目のは反応したよ。

\sは[ \t\n\r\f]と同意。
半角スペースだけでなく,タブや改行にもマッチする。
288名無しさん@お腹いっぱい。:02/02/28 01:58 ID:xJe5pzKX
あやや、それじゃあ僕の試験が間違っていたかな。
もっかいやってみます。ありがとうございました。
289285:02/02/28 02:14 ID:???
s/pattern/replace/[geoi];
左側のくくりのパターンには\sのような複数の意味をまとめたエスケープ表現は
使えるが、リプレイス部分に複数の意味を持つエスケープを書いても何に置き換えて
いいものかが曖昧になることを考えるとおのずと使えないということがわかります。
したがって、かくならつぎのようにも書けます。
s/\s+/ /g;
s/\s+/\x20/g;
290名無しさん@お腹いっぱい。:02/02/28 02:21 ID:xJe5pzKX
なるほどなるほど。そのとおりだ。僕もそう思ってました(笑)。
ところで、
s/ +/ /g;
これじゃあだめですか。いや、だめだったんですけど..。
291名無しさん@お腹いっぱい。:02/02/28 02:32 ID:???
>290
Perl5.004でうまくいったよ。
スレ違いぎみなのでsage
292285:02/02/28 02:33 ID:???
> 290
できるはずなんですが...

$_= 'a   b   c';
s/ +/ /g;
print $_,"\n";
293290:02/02/28 02:49 ID:???
なんでできないんだー。でもなんか、ド素人なんで疑う要因多すぎなんです。
勉強して出直してきます。ごめんなさい。
294nobodyさん:02/03/05 21:54 ID:X1wZ/GVz
長すぎる半角英数等を(省略)と表示されるようにしようと思いましたが、
オートリンクのa要素のhref属性の値まで省略されたので、

$comment =~ s/(<a (.+)>)?(([\w\.\/\:]){20})([\w\.\/\:]){35,}(<\/a>)?/$1$3 \(省略\)$6/g;
と書いたのですが、今度は適用されるのが最後にマッチしたヤツだけになりました。

最後にgを付けてるのに全てにマッチされないのは何故ですか?
また、この記述より(・∀・)イイ!!のがあればご教授ください。
おながいします。
295nobodyさん:02/03/06 00:04 ID:???

296nobodyさん:02/03/06 00:18 ID:???
>295
なっ、なるほどぉ。

勉強になりました。
297294:02/03/06 00:42 ID:???
今日はもう、枕濡らして寝ます。枕ないけど。
298nobodyさん:02/03/06 01:41 ID:???
>>294
複雑で私の頭じゃあまり理解できなかったのだけど
s/(\w{20})\w{5,}/$1(略)/g;
じゃダメ?
299nobodyさん:02/03/06 01:45 ID:???
>>294
試してないけど最初を
<a [^>]+>
にしてみてはどうか?
300nobodyさん:02/03/06 05:25 ID:???
>>294
一応できたよ.a要素だけに限らずタグの内側の文字列はいじらないようにしてみた.
つうか思いッきり>>273-274をパクッてます(w.制限は単純に5文字.

$comment = join '',
    map { /^</ or s/([:\.\/\w]{5})[:\.\/\w]+/$1(省略)/go; $_ }
    split /(<[^>]*>)/, $comment;


ついでにファイルから読み込みつつ変換するスクリプトも用意してみたよ.

my ($char, $tail) = (q{[:./\w]}, '');
open IN, "./in.html" or die;
open OUT, ">./out.html" or die;
while (my $comment = <IN>) {
    my @tmp = split /(<[^>]*?>)/, $tail . $comment;
    $tail = ($tmp[-1] =~ /^<.*>$/ ? '' : pop @tmp);
    $comment = join '', map { /^</ or s/($char{5})$char+/$1(省略)/go; $_ } @tmp;
    print OUT $comment;
}
close IN;
close OUT;

↓こんなふうにタグが複数行にわたって記述されていた場合を考慮してます.
<a
 href="http://hoge.hoge.hoge/"
 accesskey="h"
 title="ほげ〜">
301294:02/03/06 06:52 ID:???
>>297-300
みなさん、ありがとうございます。
300氏の方法で上手くいきました。
教えられた関数等について調べてみます。
ホントにありがとうございました!
302nobodyさん:02/03/08 15:33 ID:???
>>297
むしろ
「枕ないけど」にもらい泣き
( ´Д⊂ヽ ウエーン
303nobodyさん:02/03/08 15:38 ID:2kUcWket
304nobodyさん:02/03/08 17:26 ID:???
>>302
バカヤロウ!あのセリフの後には
「枕ないけど(彼女の膝枕で)」と続くんだぞ!?

…くやし泣き( ´Д⊂ヽ ウエーン
305294:02/03/08 21:21 ID:???
・・・彼女もいませんが。
( ´Д⊂ヽ ウエーン
306 :02/03/27 11:31 ID:zMki/eSS
age
307nobodyさん:02/04/08 22:52 ID:qnubSkpk
age
308nobodyさん:02/04/10 00:54 ID:???
print $a || $b == 0 ? "●" : "◯";
ってどういう意味なんですか、おしえてください。
309nobodyさん:02/04/10 00:58 ID:???
>>308
三項演算子とorだ。

or dieの応用編かつPerl4仕様だ。
310nobodyさん:02/04/10 02:11 ID:???
if ($a) {
  print $a;
} elsif ($b == 0) {
  print "●";
} else {
  print "◯";
}
311nobodyさん:02/04/10 02:22 ID:???
>308
単に三項演算子の結果を印字してるだけのこと。

>309
なんでここで die が出てくるんだ? あたまの弱い人か?

>310
認識違いもはなはだしい。はなしにならない。価値のない人間か?
312nobodyさん:02/04/10 02:49 ID:???
>>311
お前から見て、価値のない人が世の中には多いけど、
それはお前自身の価値が高すぎるからじゃなくて、
お前の価値が、社会の常識とかけ離れているからなんだよ。
313nobodyさん:02/04/10 05:25 ID:???
if ($a || $b == 0) {
print '●'
}else{
print '○'
}

print ($a || $b == 0) ? "●" : "◯";
こう書くと誤解がないかも

309は「or dieの応用編だ」といっているわけで
314nobodyさん:02/04/10 07:15 ID:???
>>311
たとえ話って言葉を知らない融通の利かない方ですか?
315nobodyさん:02/04/10 12:27 ID:???
>>311じゃないが、

print open IO, $a || $b ? "ok" : "not ok";

これを "or dieの応用編かつperl4仕様だ。"といわれりゃ、そりゃ"ハァ?"だろ。

open(IO, $a) || print("not ok");

これならそう言えないこともないが。
316nobodyさん:02/04/10 14:29 ID:???
>315
たしかにそうだよね。
or die ってのを応用したものが ($a || $b == 0) ってのは矛盾してるよね。
ってことは、309は 「(print $a) || ($b == 0 ? "●" : "◯");」だと
勘違いしていたのでは?

つまり311の言うあたまの弱い人ってのは図星かも...
317nobodyさん:02/04/10 14:47 ID:???
で、どこらへんが正規表現なんでしょうか?

318nobodyさん:02/04/10 15:46 ID:???
まあ、釣れた、とだけ言っておきましょうか 藁
319nobodyさん:02/04/11 16:42 ID:9/X5PbzJ
あたまの悪い人を除去するせいきひょうげんをおしえて下さい。
320nobodyさん:02/04/11 19:02 ID:???
die if /(BASIC|COBOL)/cgi;


321ぷうすけ:02/04/11 22:56 ID:KLtv0nPl
顔文字を正規表現で表すには!?
322nobodyさん:02/04/11 23:07 ID:???
>>321
ヒアドキュメント
323nobodyさん:02/04/20 18:04 ID:wIgJDzcz
漢字、ひらがな、英数文字で、書かれているテキストファイルから、
ひらがなだけを、抽出したいのだが
頭が悪いのでよく分からん、教えてくれ。

テキストファイルの入出力は置いておいて。こんな感じの事が行いたいのだ。

$str = "頭が悪い";
$str = ~/[あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん]/;
print $str,"\n";

頭が悪いのでこのように書いたのだが、実行すると

「頭が悪い」
になってしまうのだ、

本当は

「がい」

を求めたいのだができん。
わしより頭の良い、2チャンネラー達宜しく頼む。
324nobodyさん:02/04/20 18:18 ID:???
>>323 = 某研究者
325nobodyさん:02/04/20 20:04 ID:???
>>323
# SHIFT_JIS用
my $str = "書き込みえらー出そうだね。";
print $str =~ /\x82[\x9F-\xF1]/g;
326nobodyさん:02/04/20 20:32 ID:wIgJDzcz
>>325
すまんが、EUCの時はどうするかついでに教えてくれくれぬか。
頼む。
327nobodyさん:02/04/20 20:48 ID:???
328nobodyさん:02/04/20 21:14 ID:wIgJDzcz
>>327
ジョークのセンスも真似たかったが、
頭が悪いので、今宵そこまで気が回らぬ

ありがたく承ったぞ。

my $str = "書き込みえらー出そうだね。";
print $str =~ /\xA4[\xA1-\xF3]/g;
329nobodyさん:02/04/24 00:23 ID:IbG6vdJY
perlで半角英数字を"a"という文字に変更する書き方を教えてください。
330nobodyさん:02/04/24 00:36 ID:aRrtBceI
>>329
$val = $text
$val =~ s/[A-Za-z0-9]/a/g;
331nobodyさん:02/04/24 00:42 ID:IbG6vdJY
ありがとうございます。
332nobodyさん:02/04/24 00:44 ID:IbG6vdJY
あっ間違えた。半角英数字以外の文字を1文字ずつaにする方法が知りたかったのだ。
$val=~s/[^A-Za-z0-9]/a/g;でいいのでしょうか。
333nobodyさん:02/04/24 00:49 ID:aRrtBceI
OKです。
また、エスケープシーケンス使ってこんなのでもOK。
$val=~s/\W/a/g;
334nobodyさん:02/04/24 00:57 ID:IbG6vdJY
1文字ずつ変更するものなのかわからなかったもので。ありがとうございます。
335nobodyさん:02/04/24 01:00 ID:???
>>333
\Wだと'_'が変換されない罠
336nobodyさん:02/04/24 01:11 ID:???
>>335
すまった!(ワラ
337nobodyさん:02/04/24 02:20 ID:gV/ea89m
>>332
これってタブとか文字コードやスペースも変換してくれるのでしょうか。
338nobodyさん:02/04/24 02:30 ID:???
(´-`).。oO(文字コードの変換ってなんだろう…)
339nobodyさん:02/04/24 04:44 ID:???
絵文字のように文字にならないコードのことと思われ
340 :02/04/24 07:09 ID:AP/UWkPc
>>337
&hearts;のような実体参照はaにはならず&aaaaaa;になる。
341 :02/04/24 07:10 ID:AP/UWkPc
>>337
&hearts;のような実体参照はaにはならずaheartsaになる。
342 :02/04/24 07:11 ID:AP/UWkPc
340は間違えた。
343nobodyさん:02/04/24 15:36 ID:???
>>340
実体参照でなく絵文字のようなコードは。
CGIぽん
ttp://specters.net/cgipon/labo/it_emoji.html
344nobodyさん:02/04/24 18:26 ID:???
部分文字列としてabとbaを同じ数だけ含むような文字列にマッチする正規表現を教えてください。
345nobodyさん:02/04/24 20:08 ID:???
「abとbaを同じ数だけ含むような文字列」とやらを教えてください。
346nobodyさん:02/04/25 06:16 ID:???
abaとかabaaaabaaです。
347nobodyさん:02/04/25 07:50 ID:???
>>346
my $str = 'abaaaabaa';
my (@ab, @ba);
print 'Matched' if (@ab = $str =~ /ab/g) == (@ba = $str =~ /ba/g);

"aba" みたいにマッチ箇所がオーバーラップしていても良いのなら上のやつで.
正規表現一発でいけるのなら漏れも知りたい.

マッチ箇所のオーバーラップが許されていなくて
"ababab" でも "ab a ba b" と分けられるからマッチだ! とかいう難問かとオモタヨ…
348nobodyさん:02/05/02 00:59 ID:ErHIGJRy
>>347
> マッチ箇所のオーバーラップが許されていなくて
> "ababab" でも "ab a ba b" と分けられるからマッチだ! とかいう難問かとオモタヨ…

これって出来るの?
349nobodyさん:02/05/03 01:20 ID:???
オレにはパターンマッチ・置換を正規表現でできなかったためしがない。
なんでもオレに聞きやがれ。適切な答えをはじき出してオマエに叩きつけて
やるゼ!

きっ、きまったぁ!
350nobodyさん:02/05/03 11:30 ID:6+RS1vf9
ばーkぁいl7いl7いl7いl7いl7い
l7いl7いl7いl7いl7いl7いl7kyそpr
@いhw45えsっyyyyyyyyybhんtrs5じゅhじゅ
hじゅhじゅhじゅhじゅhじゅhじゅhじゅhじゅhじゅhじゅh
ゅhじゅhじゅy234rthじゅrthjrstw45hjhjt5
hjt5346
コテハンは死ね!
351nobodyさん:02/05/09 06:02 ID:???
すいません、perl で URL の表記を区切って使用したいのですが、
正規表現の理解が浅く、まだ上手くできません。
存在しないサービスや、表記の規則違反はあとで考えるとして、
どのようなパターンで取り出せば良いものでしょうか。

my $rule = '([a-z]+)://([^:/@]*):?([^@:/]*)@?([\d\w._\-]*):?(\d*)([\d\w._/\-]*)\??([\w\d%=+&]*)';
my $url = 'http://user:[email protected]:21/path/?key=value&query';
my ($service, $user, $pass, $host, $port, $path, $query) = $url =~ m/$rule/;

このままですと http://host.net/path/ のような user@pass が
全く省かれた場合に、前に詰まってしまいました。
読み難い上に無駄な指定も多いのですが、何方かご教授願えませんか?
352nobodyさん:02/05/09 20:53 ID:???
>>351
他にも問題は山積しているんだけど、取り敢えず ? がどこまで有効なのか考えよう。
(〜)@? → (〜@)? とか。
353nobodyさん:02/05/09 21:37 ID:???
>>352
有難う御座います。() の後に ? を置けるのは初めて知りました。
マッチするのは直前の単なる一文字ではなく、一パターンだったのですか。

# http URL の正規表現
# http://www.din.or.jp/~ohzaki/perl.htm#httpURL
ココを参考にしながら精進する事にします。
354531:02/05/09 21:57 ID:???
御陰様でなんとか出来たような感じです。

(?:([a-z]+)://)?       # Service
(?:([^:/@]*)?:?([^@:/]*)?@)? # ID:PASS
([\d\w._\-]*)         # Host
(?::(\d*))?          # Port
(?:([\d\w~._/%\-]*))?     # Path
(?:\??([\w\d%=+&]*))?     # Query

よく考えると皆さんが正規表現に凝ってらっしゃるのは
エラー (汚染) チェックも兼ね備えているからなんですかね。
私も早く安心して任せられるようになりたいです。
355nobodyさん:02/05/09 22:31 ID:???
>>354
頑張ってなー。あと、質問する時はなるべくageてなー。
356351=353=354:02/05/09 23:50 ID:???
>>355 ハイです (*´ー`*)
357351:02/05/10 23:19 ID:???
>>354 自己レスですが、\w を [A-Za-z] だと勘違いしてました (汗
358nobodyさん:02/05/15 23:13 ID:???
特定の文字列以降の文字を消すのはどうやるのですか?
厨質問ですみませんです。
359nobodyさん:02/05/16 00:44 ID:???
>>358
$_ = 'Look-behindで文章中の特定文字列以降の文字を消すよ.';
s/(?<=特定文字列).*//s;

Perl 5.005 以前のバージョンならこっちで.
s/(特定文字列).*/$1/s;
360nobodyさん:02/05/16 01:26 ID:???
>>359
どうも、ありがとうございます。
やってみます。
361nobodyさん:02/05/26 06:41 ID:65ctyZPu
タグの中からパスを取り出そうとしているのですが
$str = "<a href=\"./hoge/hoge.html\"><img src=\"./hoge.jpg\"></a>";
if($str =~ /<a href="(.*?\.jpg)">/i){print $1."\n";}
とすると、何も出力されないはずなのに
./hoge/hoge.html"><img src="./hoge.jpg
と出力されてしまいます。どうすればよいのでしょうか?
362nobodyさん:02/05/26 07:59 ID:???
>何も出力されないはずなのに
いや、.*?なら出力されると思うよ。(<a href="になってるのは間違い?)
./hoge.jpgが欲しいなら /<img src="([^"]+\.jpg)">/に変えてみれば?
363nobodyさん:02/05/26 08:22 ID:65ctyZPu
>>362
いや、./hoge.jpgが欲しいんじゃなくて
aタグの""の中身にはマッチしないから何も出力しないようにしたいのですが。
(もちろんhtmlとかにすると出力されるようにはしたい)
364nobodyさん:02/05/26 23:36 ID:???
>>361
/<a href="([^"'>]*?\.jpg)">/i

[^]の使い方でも勉強すればぁ?(゚Д゚)
365nobodyさん:02/05/27 00:50 ID:???
HTML::LinkExtorを使うのが正しいかと。
366nobodyさん:02/05/27 02:58 ID:???
>>364
すいません。>>362の解答を応用してなんとかできした。
367nobody:02/06/24 01:33 ID:???
すんません、
http://pc.2ch.net/test/read.cgi/php/1011460833/24
これお願いします
368nobodyさん:02/06/24 03:27 ID:???
m{<a\s+[^>]*href=["]?((?:http://)?[-_.!~*'()a-zA-Z0-9;/?:\@&=+\$,%#]+)["]?[^>]*>([^<]+)</a>}i
369nobodyさん:02/06/24 03:39 ID:???
>>367
Perlでド適当に書くとこんな感じ.

my ($href, $title);
while ($str =~ m{<a\s+(?:href\s*=\s*(["'])(.+?)\1|.)+?>(.+?)</a>}gis) {
    ($href, $title) = ($2, $3);
    $href or next;
    print  "href: $href\ntitle: $3\n\n";
}
370nobodyさん:02/06/24 03:53 ID:???
>>369
細かいけど、*(["'])(.+?)\1 の部分、
(.+?)だと空白入りません?
371367:02/06/24 04:33 ID:???
>>368-370
ありがとうございます。
参考にして
$u="dsffds<a target=\"_self\" href=\"http://www.age.sage/\" name=\"lewraw\">age</a>aaa";
$pt="<a.*href=\"?(http://.[^\"[:space:]>]*).*>(.*)</a>";
if(ereg($pt,$u,$a))print_r($a);
みたいにしてみたらうまくいきました。
Array
(
[0] => <a target="_self" href="http://www.age.sage/" name="lewraw">age</a>
[1] => http://www.age.sage/
[2] => age
)
なんか問題があったら指摘よろしくです。
372nobodyさん:02/06/24 04:58 ID:???
>>370
うん,空白どころか何でも入るよ.だからド適当なの.許して.
373nobodyさん:02/06/28 00:21 ID:J53QbdCk
名前にtaroかjiroが含まれてたら云々、、ってので、
(taro|jiro)って書いたら動きませんでした。アホですか?
374nobodyさん:02/06/28 00:45 ID:???
>>373
それしか情報を出さずに意図が伝わると思ってるならアホだな。
375nobodyさん:02/06/28 01:31 ID:J53QbdCk
それしか、、と言われればそれしかなんですが、これ以上書いても意味ないかなと。。
一応書いておくと、PHPで、
ereg((taro|jiro),$name)
と書いてあります。アホですか?
376nobodyさん:02/06/28 03:26 ID:???
>>373
アホだな。
コードはもちろん言語も書いてない。
どういうデータをマッチ対象にしてるのかも書いてない。
373の質問で答えが出ると本気で考えている?
それだけの状態で「taroかjiroにマッチさせるならそれでいいはずです。」
としか答えられないぞ。

ereg( 'taro|jiro', $name)
PHPは良く知らないけどその>>375のコードでエラー無く動くの?
377nobodyさん:02/06/28 20:10 ID:QMNhJJyt
上のコードだとエラーは起きないけどマッチしてくれません。
正規表現苦手でして、、すいません、、
378nobodyさん:02/06/29 03:23 ID:???
PHP スレで聞けば?

俺、PHP全然解らないから、 ereg 関数の第1パラメーターが
正規表現もオッケーなのか解らないから答えようがない…
379nobodyさん:02/06/30 14:39 ID:ZCEQ9KmT
$hoge = tr/hoge//d;
こういう場合に、「hoge」に完全にマッチした場合のみ削除するにはどうすればいいのですか?
380&r:02/06/30 14:41 ID:???
$hoge=~ s/hoge//g;
381 :02/06/30 14:47 ID:5Ce/MloT
「100から150までの数字をチェックするには、"[#100:150]"」
これはProxomitronのヘルプにあったんですが、Perlでこれをやるにはどうすればいいのでしょうか?
382 :02/06/30 14:50 ID:???
あっ 1[0-5][0-9]という事ではなくて、
[38-523]のような・・・
383&r:02/06/30 14:57 ID:???
この場合は正規表現を使う必要はなくて、演算子を使います。

100 <= $hoge && $hoge <= 150;

これが真を返すか偽を返すかです。
384nobodyさん:02/06/30 15:00 ID:???
>>380
ありがとうですた
385382:02/06/30 15:05 ID:???
うーん なるほど。
386ororo:02/06/30 19:03 ID:iJPZXMQB
****************
/root
/hoge
/root/hoge
/root/some/hoge
****************

で、/rootと/hogeだけ取り出すのって
どーやったらよいんでしょうか?

/*だと、/も含まれちゃうんで。

/がでて、その後に/以外の文字列が続くものを
検出したいんですけど。

[^/]とか使う感じのイメージはあるんですが。
387ororo:02/06/30 19:16 ID:???
あ、/が二回でてこないのでもいいかもです。
388&r:02/06/30 19:28 ID:???
>387
@set= qw(/root /hoge /root/hoge /root/some/hoge);

for ( @set ){
    /^(\/[^\/]+)/ && print $1,"\n";
}
389nobodyさん:02/06/30 19:45 ID:???
386の別解。388のほうが効率よさげだけど。
@set= qw(/root /hoge /root/hoge /root/some/hoge);
@selected = grep { /^\/[^\/]+$/ } @set;
390&r:02/06/30 19:49 ID:???
>389
末尾一致させないので $ が要らない罠
391&r:02/06/30 19:50 ID:???
>389
マッチ部分の取り出しができていない罠
392&r:02/06/30 19:52 ID:???
>389
書くんなら
@selected = map { /^(\/[^\/]+)/ ? $1 : () } @set;
393&r:02/06/30 20:06 ID:???
あーっ、ひょっとしてわたしが勘違い?
よく読んだらリストの上2つを取り出すってことか。

てっきり勘違いして /root および /hoge ディレクトリを含むパス
のリストを抜き出すのかと思ってた。
394ororo:02/06/30 22:56 ID:???
>393

>389の方の答えが望んでた答えっす。

ありがとうございますた。
395nobodyさん:02/07/01 01:29 ID:???
>>389
ねね? qw って何?

>>390-393 ウザイ。氏ね
396nobodyさん:02/07/01 01:44 ID:???
>>395
ここで聞く前に調べろクズ!
397nobodyさん:02/07/01 05:32 ID:???
>>389
@selected = grep m{^/[^/]+$}, @set;

せめてこれくらいの可読性は確保しよう。
grepにブロックを使うのは、どうしても必要な時だけにした方が
いいかもしれない。
398nobodyさん:02/07/01 15:54 ID:???
>>396 ネタニマジレス(・∀・)カコイイ!!
399nobodyさん:02/07/02 00:42 ID:icSYdM+A

title>url って文字列があったとき、
title と url を切り分ける処理をするとします。
ただし、> と < と & と " あたりは &..; に置き換えられてるから
実際は title>;url を処理することに。

で、問題はバックスラッシュによるエスケープを導入するとき
どうしたらいいのかなんですが...

title\>;hoge>;url -> ( title\>;, url )

^(?:((?:\\.|.)+?)>;)?(.*)$

で出来なくてお手上げです。
どうしたらいいんでしょう…
400nobodyさん:02/07/02 00:55 ID:???
>399
質問もまともに書けないのか?
401nobodyさん:02/07/02 00:59 ID:???
>>399
意味不明
402nobodyさん:02/07/02 01:01 ID:???
>>399
病気か?
403nobodyさん:02/07/02 01:55 ID:???
>>399
あらてのアラシか?
404nobodyさん:02/07/03 15:23 ID:kdrdWrUq
>399-403
ジサクジエンデシタ
405ahaaann:02/07/03 17:36 ID:eJO6ovYm
ahaann
406nobodyさん:02/07/04 19:37 ID:hx78UF1Q
教えて下さい
 ログイン名をsageで登録しようとすると、すでに登録されていて
あと、sage1、sage34が登録可能です。みたいに、するにはどうすれば
宜しいのでしょうか?
お願い致します。
407nobodyさん:02/07/04 19:45 ID:???
>>406
データベースをつかうかファイルにデータ保存してもっておくかすればいいじゃん。
408nobodyさん:02/07/04 19:47 ID:???
>>406
あるかどうか調べて、あったらランダムに数字を付け足した文字を出せばいいんじゃない?
409nobodyさん:02/07/08 15:23 ID:3WwYz0B2
/((19(0[48]|[2468][048]|[13579][26])|20([02468][048]|[13579][26]))\/02\/29|(19|20)\d{2}\/((04|06|11)\/(0[1-9]|[12]\d|3[0])|(0[13578]|10|12)\/(0[1-9]|[12]\d|3[01])|(02\/(0[1-9]|1\d|2[0-8]))))/
YYYY/MM/DD 形式で、1900年から2099年まで処理可能な日付チェック。
410nobodyさん:02/07/08 15:38 ID:???
わざわざ、正規表現で行う必要あるのかと…(略
411nobodyさん:02/07/08 22:10 ID:Hy1uHDxp
たとえば、
1.$rei = abc?def?ghi? というのと、
2.$rei = abc?def?ghi というのがあるとして、

?が最後につくかつかないかを判別する方法って
なにかありますか?
それで、2の場合、
$rei = abc?def?ghi を
$rei = abc?def? と、最後のghiをカットする
のも知りたいです。

やってみたのは、
1.$rei =~ s/(\?)(ghi)(\?)(jklm)$/$1$2$3/g;
2.$rei =~ s/(\?)(ghi)(\?)(jklm)(\?)$/$1$2$3$4$5/g;
でした。
(ghi) や (jklm) のところを正規表現したいんですが、
何をあててやればいいんですか?
\w{0,} とかやってみたんですが、うまくいかなくて。
412nobodyさん:02/07/08 22:27 ID:???
 if( /\?$/ )

 s/^(.*)\?(.+)$/$1\?/;
413nobodyさん:02/07/08 23:00 ID:???
>>410
それはプログラム技術板で半年くらい前に見たやつだ。半ばネタとして作られたものだが、
要件は満たしている。

・・・・・・・・・・・遅いけど。
414nobodyさん:02/07/08 23:02 ID:tPkNiwTi
> 412
やってみます
415>>409:02/07/10 17:12 ID:???
m!\d{4}/\d{2}/\d{2}!;
($year, $month, $day) = ($1, $2, $3);
next unless (($year >= 1900) and ($year <= 2099) and ($month > 0) and ($month <= 12) and ($day > 0) and ($day <= 31))

ま、>>409 はネタだと思うが。
416nobodyさん:02/07/10 23:27 ID:PCSWC5jP
HTTP::Request関数を使うとき、メソッドがPOSTの場合、

my $req = new HTTP::Request POST => $URL;
$req->content_type('application/x-www-form-urlencoded');
$req->content('match=www&errors=0');

って書いたけど、GETの場合は、

my $req = HTTP::Request->;new(GET => $URL;

だけでよい?
417 :02/07/11 00:28 ID:???
<BODY background="aaa.jpg" bgcolor="#000000">
ってあった場合""の中身だけ取り出すのはどうしたらいいでしょうか?
(つまりこの場合、aaa.jpgと#000000)
418nobodyさん:02/07/11 00:39 ID:???
>>417
/"\w"/g;
419 ◆K1SiC5MI :02/07/11 01:38 ID:???
>>417
/"([^"]+)"/g;
420417:02/07/11 02:41 ID:???
どもです。/"\w+"/g で出来ました
421nobodyさん:02/07/11 10:43 ID:???
>>420
\wには.と#が含まれんが本当にできたのか?
422418:02/07/12 00:05 ID:???
>>421
昨日書き込みしたあとから思ってた。
(あーこれ#とかはいらねーからだめだわ。でも書き直すのめんどくさいしいいか。)
423nobodyさん:02/07/12 08:54 ID:UFWs6b8F
/(^-^)/
424nobodyさん:02/07/13 01:14 ID:???
s/>>423//;
425nobodyさん:02/07/14 00:00 ID:???
s/424の人生//g;
426 :02/07/14 01:01 ID:???
s/425の将来/鬱/g;
427nobodyさん:02/07/14 05:32 ID:???
$2ch =~ s/2ch/3ch/g;
428nobodyさん:02/07/14 12:17 ID:???
s/>>428/俺/g;
429nobodyさん:02/07/14 15:59 ID:???
$here =~s/^.*$/削除依頼/s;
430性器初心者:02/07/15 14:17 ID:5LzaPgx6
すんません。正規表現わかんないですー。
半角英数文字のパスワードのチェックをかけたくて,言語PHPなんですが。。。

echo ereg('([a-zA-Z0-9_])',"123=$");

結果は1と返ってきます。FALSEと評価してほしいのですが?
どなたかご指導くださいな。
431コギャル&中高生:02/07/15 16:38 ID:VlVzBsms
http://www1.ocn.ne.jp/~kado77/mimi/

お役立ちリンク集
必ず役立ちます

コギャルとH出来るサイトはここ
ヌキヌキ部屋へ直行便

http://kado7.ug.to/wowo/
432nobodyさん:02/07/15 21:45 ID:???
なんか最近、アクセス数を荒稼ぎするためにスレ違いのURLアドレスを
リンクさせてるヤシが目につくから、そのサーバ自体をDOSるのもこれ
たのし!
433ぽよぽようんこ:02/07/15 22:30 ID:uZYoW+tQ
しつもんさせてちょ。
perl使ってます。
if ($line !~ /\w{3,12}/) {&error;}
ってやってます。僕的には英数3〜12文字じゃなかったらエラーって意味のつもり
なのですがうまく行きません。下限は有効なんですが、上限12文字超えても
エラーが出ないんです。どこかおかしなところありますか?宜しくお願いします。
434nobodyさん:02/07/15 22:32 ID:???
if ($line !~ /^\w{3,12}$/) {&error;}
先頭から行末までがないだろうが。
435ぽよぽようんこ:02/07/15 22:38 ID:???
!!なんと!!
僕は1年以上もマッチングというものの使い方を間違えていました!
なぜ今までうまく行っていたんだろう。
取り合えず、どうもありがとうございました。大変助かりました。
436nobodyさん:02/07/15 22:46 ID:???
>>433
文字列の中に埋もれてる連続英数字数を判定したいなら最短マッチで。
if ($line !~ /\w{3,12}?/) {&error;}
437ぽよぽようんこ:02/07/15 23:06 ID:???
>>436
アフォでつか? レベルが低過ぎるね!
438436じゃないよ:02/07/15 23:27 ID:???
感じわる〜
439ぽよぽようんこ(本物):02/07/16 00:00 ID:???
>>437 こらこら。人のステハン拾うな。
>>436 ありがとうございます。ていうか?って半年くらい使ってないから何なのか忘れちったよ。
とステハンの名誉を守ったり。何やってんだ俺。
440ぽよぽようんこ(本物):02/07/16 00:06 ID:???
以上、自作自演でしたー。
441nobodyさん:02/07/16 14:04 ID:FumLlavC
<BR>と<A>以外のタグを取り除くにはどうすればよいのでしょうか?
素人的発想で

$data2 =~ s|<BR>|kaigyo|ig;
$data2 =~ s|<A(.*?)>|ri$1nk|ig;
$data2 =~ s|</A>|rinktoji|ig;
$data2 =~ s|http:(.*?)<BR>|jido$1rin|ig;

$data2 =~ s|<(.*?)>||g;

$data2 =~ s|kaigyo|<BR>|ig;
$data2 =~ s|ri(.*?)nk|<A$1>|ig;
$data2 =~ s|rinktoji|</A>|ig;
$data2 =~ s|jido(.*?)rin|<A HREF="http:$1">http:$1</A><BR>|ig;

とかやってみたけど駄目でした…
442nobodyさん:02/07/16 14:43 ID:???
>>441 Perlメモ見れ
443素人:02/07/16 23:10 ID:???
>>441
こんなのしか書けない。しかも合ってるか分からない。

$data2 =~ s/<(A|\/A|BR)/<>$1/ig;
$data2 =~ s/<[^>]+>//g;
$data2 =~ s/<>(A|\/A|BR)/<$1/ig;

一発でやるの教えてください。
444nobodyさん:02/07/16 23:26 ID:???
445ぽよぽようんこ(本物):02/07/16 23:52 ID:???
この程度のこともできんのか?
s/<(?:(?!BR|\/?A[^>]*).)*>//g;
446素人:02/07/17 00:01 ID:???
>>445
>>444に書いてあったモジュールで遊ぼうかと思ったところに…

おおお!と思ったんですがエラーが出ます。なんで?
447素人:02/07/17 00:03 ID:???
できました!

でも全然意味が分からない。
448nobodyさん:02/07/17 02:14 ID:???
>>445
んならこーじゃねーの?
s/<(?:(?!BR|\/?A[\s>][^>]*).)*>//ig;
449nobodyさん:02/07/17 22:13 ID:???
Perlの正規表現で悩んでいます。
[[と]]の間に囲まれていないabcを置き換えしたいのです。
[[zzzabczzz]]や[[zzzabc]]や[[abczzz]]や[[abc]]にマッチさせず、
[zzzabczzz]やzzzabczzzなどのabcの部分を置き換えたいのです。
助けてください。
450nobodyさん:02/07/17 22:31 ID:???
[^\[\[.*abc*\]\]]
451nobodyさん:02/07/18 00:01 ID:???
452nobodyさん:02/07/18 00:57 ID:???
>>449
WikiWiki ですか?いいもの出来たら公開してね〜
453nobodyさん:02/07/18 19:16 ID:???

$dataの中に、id=とurl=とname=が含まれていて、なおかつ=が3個含まれていたら
真の値を返すようにしたいのですがどうやるのでしょうか?

(($data =~ /id= && url= && name=/) && ($data =~ /={3}/)) || exit;

454453:02/07/18 19:25 ID:???
すいません間違えました。

id=とurl=とname=が含まれていて、なおかつ&が2個含まれていたらの場合です。
455nobodyさん:02/07/18 22:43 ID:pCMKii71
($data =~ /(?=.*id=)(?=.*url=)(?=.*name=)/ && $data =~ /^(?:[^&]*&[^&]*){2}$/)
456 ◆Smt8k/ss :02/07/19 00:01 ID:???
($data=~ /(?=.*id=)(?=.*url=)(?=.*name=)/ && $data=~ tr/&//== 2);
457 ◆JAPH9PWA :02/07/19 00:12 ID:???
フツーに
$_ = $data;
(/id=/ and /=url/ and /name=/ and (tr/&// == 2))
でいい気が。
458 ◆JAPH9PWA :02/07/19 00:13 ID:???
s/=url/url=/
459nobodyさん:02/07/19 13:27 ID:SM5AMgkw
リンクを張りたいのですが。http://aaa.bbb.ccc/ddd/ee.ff

但し、URLの中に「AaA」又は「BaB」という文字列があるならば、
リンクさせない方法はどうすればいいのでしょうか。
http://aaa.bbb.ccc/ddd/ee.ffAaA
http://aBaBaa.bbb.ccc/ddd/ee.ff

$mes=~s/http:\/\/([\w|\:\!\#\$\%\=\&\-\^\`\\\|\@\~\[\{\]\}\;\+\*\,\.\?\/]+)/<a href=\"http:\/\/\:$2\" target=\"_blank\">http:\/\/\:$2<\/a>/ig;
460nobodyさん:02/07/19 13:56 ID:???
/AaA|BaB/;
461nobodyさん:02/07/19 14:04 ID:???
>>459
大文字にマッチさせたくないんだったら、
\wをa-z0-9、iを削除でいいんじゃないの?
どうでもいいけど、エスケープしすぎ。
462nobodyさん:02/07/19 14:07 ID:???
区切りに / でなく | でもつかえばエスケープする回数も減るだろ。
463nobodyさん:02/07/19 14:55 ID:???
傾斜つまようじ症候群というやつですな。
464nobodyさん:02/07/19 15:37 ID:???
掲示板で特定のタグ「以外の」タグが書き込まれたら真を返す, というのがやりたいのですが.
とりあえず "<" で始まり, こちらが指定(a, em, dl, etc...)したもの以外の文字列(font, blink, hogehoge, etc...)があったら, というカンジで.
465nobodyさん:02/07/19 15:39 ID:???
unless ( $_ =~ /<(a|img|font).*>/ )
466nobodyさん:02/07/20 05:20 ID:???
>>465
正規表現わからんなら書くな。
467nobodyさん:02/07/20 07:10 ID:???
if(/<(?!\/|a\s|img|font)[^>]*>/g);
468間違えた:02/07/20 07:14 ID:???
if(/<(?!\/|a\s|img|font)[^>]*>/i);

469nobodyさん:02/07/20 14:18 ID:???
>>468
正規表現わからんなら書くな。
470nobodyさん:02/07/20 16:31 ID:???
>>466
>>469
そう言うおまいも正規表現わからんくせに書くな。
471.&rlo;正規表現は簡単ね&lro;:02/07/20 17:15 ID:???
>>470
>>466>>469が正規表現わかってないという根拠は?
少なくとも>>468のようなとんちんかんな正規表現を見ての意見だと思うが…。
472あぼーん:あぼーん
あぼーん
473薄らキリストが見える :02/07/20 19:06 ID:???
474nobodyさん:02/07/20 22:23 ID:???
つーか正規表現って最初に訳した香具師ドキュソだな
もっと適切な日本語使ってくれよ
475nobodyさん:02/07/21 16:35 ID:???
って別に検索に用いるためだけのじゃないし。
言語処理関係の勉強すれば正規表現ってのは
自然な訳だと思えるようになるよ。
476nobodyさん:02/07/22 00:29 ID:???
regular expression
正規 表現

これを自然な訳と思えるあなたとは日本語で話したくありません
477♦#:02/07/22 14:53 ID:???
>>476
じゃあ、英語かなんかで話したいのか?
478nobodyさん:02/07/22 20:20 ID:???
$c =~ m|[^A-Za-z0-9;/&?:@=+$,\-_.!~*'()%]|

で、2つの | はどういう役割をしているのでしょうか?
479nobodyさん:02/07/22 20:42 ID:???
>>478
$c =~ /[^A-Za-z0-9;/&?:@=+$,\-_.!~*'()%]/
でもいいし
$c =~ m{[^A-Za-z0-9;/&?:@=+$,\-_.!~*'()%]}
でも何でもいいよ。
480nobodyさん:02/07/22 20:42 ID:???
 / 以外も区切りに使えることを知らないのか?結局正規表現だよ。
481479:02/07/22 20:51 ID:???
$c =~ /[^A-Za-z0-9;/&?:@=+$,\-_.!~*'()%]/
はだめでした。
$c =~ /[^A-Za-z0-9;\/&?:@=+$,\-_.!~*'()%]/
です。
デリミタは普通 / を使います。この場合先頭の m は省略できますが、
中身のパターンに / が含まれる場合は \/ というようにエスケープしないといけません。
それを避けるためにデリミタを / 以外のもの | に変えているのです。
482478:02/07/22 22:29 ID:???
>>479-481
空白文字を除く任意の非英数字が
区切り文字に使えるとは知りませんでした。
どうもありがとうございました。
483nobodyさん:02/07/23 02:19 ID:XF1QbVW3
オレも勉強になった。
484nobodyさん:02/07/23 04:14 ID:8Y4x0Hwt
$data = '1<br>23<Br>3<br>45<br><br>666<br>
54<br>354<br>54<Br>43<br>';

の時、例えば
6個目の<br>から先を削除する方法ってわかります?
理想結果はこんな感じです。

$result = '1<br>23<Br>3<br>45<br><br>666<br>';

485nobodyさん:02/07/23 04:36 ID:???
>>484
最後の<br>が入んないけど、まぁこんなのどうでしょう。
my $data = ...;
my $foo = join( "<br>", (split( /<br>/i, $data))[0..5] );
486484:02/07/23 04:58 ID:???
できました!ありがとうございました。
487nobodyさん:02/07/23 20:42 ID:???
>>476
言語処理の勉強するか首つって死んじまえ。
488nobodyさん:02/07/25 17:43 ID:???
さっくりとage
489nobodyさん:02/07/25 17:55 ID:???
>>488
sageてんじゃねえか!
490nobodyさん:02/07/25 18:09 ID:???
$_= 'この板、人いっぱいだね';

s/っぱいだ/ない/;
491nobodyさん:02/07/25 19:52 ID:???
CGIに適したPerl以外の言語は何?Ruby?
492491:02/07/25 19:53 ID:???
誤爆った
493nobodyたん:02/07/25 20:26 ID:???
perl の「正規表現」って実は正規表現ではない罠。
494_:02/07/28 16:28 ID:/dbFo95o
perlで文字列中の一番後ろの()内を切り出したいのですが、
どうもうまくいきません。

(A)B
B(A)
(C)B(A)
(A)B(C)
B(C)(A)
A

いずれもAを切り出したくて、

if ($foo =~ /(\(([^\(]+)\))+$/) {
$foo = $2;
};

とかやってみたのだけど、なんか変です。
簡単に記述できそうな気がするのだけど……。
495nobodyさん:02/07/28 17:24 ID:???
>一番後ろの()内を切り出したい
とあるのに
>(A)B(C)
においてもAを切り出したいって意味わからん。
496nobodyさん:02/07/28 17:25 ID:???
while(<DATA>){
chomp;
my $rev = reverse $_;
$rev =~ m/^.*?\)(.*?)\(/ and print "[$_]--$1", "\n";
}
__DATA__
(A)B
B(A)
(C)B(A)
(A)B(C)
B(C)(A)
A
497nobodyさん:02/07/28 18:07 ID:???
>>496
まわりくどっ!
498494:02/07/28 18:13 ID:???
>>495
あああ、それ無し無し。恥ずかしい間違いでした。

>>496
ありがとうございます。
なるほど、いっぺんreverseするんですね。
どこかで使えそうな手なので、覚えておきます。
499nobodyさん:02/07/28 18:26 ID:???
>>498
ほんとにそれで納得できた? リバースは(A)のように括弧内の文字が1文字固定
ならいいんだろうけど…。
500nobodyさん:02/07/28 18:55 ID:???
s#\(A\)(\r\n|\r|\n)?$#$1#;
501nobodyさん:02/07/28 18:59 ID:???
>>500
質問?
502500:02/07/28 19:03 ID:???
切り出すってそう言う意味かあ
はは
503494:02/07/28 20:00 ID:???
>>499
最後にもう一回reverseしてやれば良いように思いますが、
甘いですか?
504nobodyさん:02/07/28 20:07 ID:???
>>503
まぁ、満足ならそれでいいけど。効率よりもとにかく処理ができればいいなら。
505494:02/07/28 20:16 ID:???
>>504
reverseしないでマッチさせられないか、無い頭しぼって考えました。
/^.*\((.*?)\)/
駄目ですか?
506nobodyさん:02/07/28 20:19 ID:???
>>505
文字列の最後が必ず ) で終わる?
507494:02/07/28 20:22 ID:???
>>506
いま扱ってるデータだと終わります。
が、この先、そういうのが出てこないとも限らない……
出直してきます。
508nobodyさん:02/07/29 08:19 ID:???
おはようございます。

my @values = qw[(A)B B(A) (C)B(A) B(C)(A) A B(C(A)DEF BC(D(A)))E) BC(A)(D B)C(D(AAA)(E(FG BC(A)()];

for my $value (@values) {
my @hits = $value =~ /\(([^\(\)]*)\)/g;
print "$value = ",$hits[$#hits],"\n";
}

(A)B = A
B(A) = A
(C)B(A) = A
B(C)(A) = A
A =
B(C(A)DEF = A
BC(D(A)))E) = A
BC(A)(D = A
B)C(D(AAA)(E(FG = AAA
BC(A)() =

…こういう感じであってますか?
509494:02/07/29 12:19 ID:???
>>508
とりあえず()を全部マッチさせてリストにいれておくわけですね。
なるほど。思ったより簡単にできるものですね。
効率とか速度とかいわれると、よく分からないけれど……。
510nobodyさん:02/07/29 19:35 ID:???
不必要な配列をつくるし、
必要以上にパターン試すから、
メモリも多く使うし、速度もわるいよ、、、。
511nobodyさん:02/07/29 23:05 ID:MEr3AvIi
すみません、いまいちタコなのですが、
メールのsubjectなんかで、たとえばこんなのがあったとします。
[ABCDE:0110]ああ〜〜
他のパターンとして、
[ABCDE:]いい〜〜
というのもあるとします。まれに、
Re:[ABCDE:0110]うう〜〜
なんてのもあるとします。
これの数字部分“0110”を取得したいのですがうまくいきません。
$subject=~s/.*\[.*:(\d*)\].*/$1/;
なんてやったら$subject == "" になってしまいます。
いまは仕方なく、
($dummy,$subject)=split(/\[/,$subject);
($subject,$dummy)=split(/\]/,$subject);
($dummy,$subject)=split(/\:/,$subject);
なんてひどいコードですが・・・
どうも、.*ってのを使った瞬間全部がそれにマッチしてしまう気がします。
やはり正規表現でエレガントに行ってみたいのですが、どんな感じになるのでしょう?
512nobodyさん:02/07/29 23:22 ID:???
($num)= $subject=~ /:(\d*)]/;
513511:02/07/29 23:27 ID:???
>>512
ありがとうございます。
なるほど。余計なところまで書きすぎだったわけですね。ありがとうございました!(^^)/
514age:02/07/31 10:46 ID:p4UQxNW6
Googleの検索結果ページの
●●件中 ●●- ●●件目 検索にかかった時間●●秒
の行から特定の単語を切り出す正規表現を作っています。
例えば、
re = /日本語のページから(.*)を検索しました。/
re2 = /(\d+)件中(\d+) - (\d+)件目/
re3 = /検索にかかった時間(\d\.\d\d)秒/
のように3つの正規表現に分けて生成するとマッチします。
しかし、
re = /日本語のページから(.*)を検索しました。\s\s約?(\d+)件中(\d+) - (\d+)件目・・?検索にかかった時間(\d\.\d\d)秒/
のようにまとめるといくら頑張ってもマッチしません。

使用言語はrubyですが、
日本語の正規表現ってあまり長くならない方がいいのでしょうか?
515nobodyさん:02/07/31 10:47 ID:p4UQxNW6
Googleの検索結果ページの
●●件中 ●●- ●●件目 検索にかかった時間●●秒
の行から特定の単語を切り出す正規表現を作っています。
例えば、
re = /日本語のページから(.*)を検索しました。/
re2 = /(\d+)件中(\d+) - (\d+)件目/
re3 = /検索にかかった時間(\d\.\d\d)秒/
のように3つの正規表現に分けて生成するとマッチします。
しかし、
re = /日本語のページから(.*)を検索しました。\s\s約?(\d+)件中(\d+) - (\d+)件目・・?検索にかかった時間(\d\.\d\d)秒/
のようにまとめるといくら頑張ってもマッチしません。

使用言語はrubyですが、
日本語の正規表現ってあまり長くならない方がいいのでしょうか?
516mage:02/07/31 10:53 ID:p4UQxNW6
半角スペース2個を全角スペース1個で置換することって
出来ますか?
できるかどうかが知りたいです。
517479:02/07/31 11:02 ID:???
>>516
できる。
518nobodyさん:02/07/31 12:09 ID:???
>>515
タグが入っていることを考慮しているかい?
519515:02/07/31 12:30 ID:???
>>518 タグはw3m -dump で取り除いています。
--------------------------------
!/usr/bin/env ruby
keyword_file = ARGV.shift
suffix_file = ARGV.shift
# 正規表現生成
re = /日本語のページから(.*)を検索しました。/
re2 = /(\d+)件中(\d+) - (\d+)件目/
re3 = /検索にかかった時間(\d\.\d\d)秒/
File.foreach(keyword_file) do |kw|
File.foreach(suffix_file) do |sf|
w3m = IO.popen("w3m -dump 'http://www.google.com/search?ie=euc-jp&oe=euc-jp&hl=ja&meta=lr=lang_ja&num=10&q=#{kw}+#{sf}'","r")
  pat=/件中/
  w3m.each_line do |line|
   if pat =~ line
    re.match(line)       
    key = $1
    re2.match(line)
    cnt,from,to = $1,$2,$3
    re3.match(line)
    second = $1
    printf("%16s %10s  => %5d件 %10s 秒 \n",kw.chop,sf.chop,cnt,second)
   end
  end
  w3m.close
 end
end
------------------------
だとOKですが、
正規表現を一つにするとだめっぽいのです。
520515:02/07/31 12:38 ID:???
>>519
w3mでパイプしている奴を
Net::HTTPで高速化させたいですが、正規表現で
引っかかります。

なお、ほしい部分の周辺は
以下のようなHTMLです。
----------------
<table width=100% border=0 cellpa dding=1 cellspacing=0 bgcolor=#3366cc><tr><td bgcolor=#3366cc nowrap><font size=-1 color=#ffffff>
<b>日本語</b>のページから<b>hoge</b>を検索しました。 </font></td>
<td bgcolor=#3366cc align=right nowrap>
<font size=-1 color=#ffffff>約<b>37,500</b>件中<b>1</b> - <b>10</b>件目 ・検索にかかった時間<b>0.54</b>秒</font></td></tr></table>
-------------------------------------
#!/usr/bin/env ruby
require 'net/http'
host = 'www.google.co.jp'
path = '/search?num=10&lr=lang_ja&q=hoge'
http = Net::HTTP.new(host)
page=http.get(path)[1].delete("\n")
print page.scan(%r|ffffff><b>日本語.*秒</font>|i)[0].gsub(%r|<.*?>|,'')
-------------------------------------
rubyのscanの使い方が違うのかな?

もう少し、勉強してきます。
521”管理”人042:02/08/03 02:59 ID:???
>>520 さんは、スレッド 【Ruby】RubyでCGI   http://pc.2ch.net/test/read.cgi/php/988948655
とのマルチポストです。
速やかに回線を切って首を吊って下さい。
522nobodyさん:02/08/05 17:55 ID:???
チョッチュネー、下がり過ぎッチュネー!
523nobodyさん:02/08/12 04:22 ID:???
なにも言うな! あげとく。
524nobodyさん:02/08/16 21:56 ID:???
すみません、「<」と「>」の間に挟まれる文字(半角英数字、記号含む)を抜き出す
というのはどうすればいいんでしょう?
525nobodyさん:02/08/16 22:11 ID:???
>>524
ガイシュツ
526nobodyたん:02/08/19 12:47 ID:???
@hoge = ($str =~ /<(.*?)>/g);
527nobodyさん:02/08/20 11:47 ID:???
0001海
0003水着
0005スイカ
0002花火




というデータが入った配列があって
これをGrepで
0003以上(0003水着 0005スイカ)のデータを
抽出したいのですが
どのように記述してよいのかわかりません。
>= とか <= とかは正規表現では使えないですよね?

全件ループしてIF文で抽出してもよいのですが
Grepの方が速い?と思い質問させていただきました。お助け下さい。
528nobodyさん:02/08/20 11:55 ID:???
@result= grep($_ gt '0003', <DATA>);
529528:02/08/20 12:00 ID:???
間違った
@result= grep($_ ge '0003', <DATA>);
530nobodyさん:02/08/20 17:19 ID:???
>>528さん
おぅ!!!!!完璧です!!!感謝!!!!
わかると簡単だけど、最高に感謝です!!

あなたに幸がある事を祈ります!!!
本当にありがとうございました。<(..)>
531nobodyさん:02/08/26 16:09 ID:???

$b =(?=.*犬)(?=.*柴):

ループ開始
 if ($a ~ /$b/){処理}
ループ終了

ある配列をループさせて $a にその値を入れて
数千回ループさせて検索しているのですが
ものすごく遅いです。

やりたい事は $aの文字列に ある文字(複数)があるかを高速に
検索したいです

もっと高速に検索する方法はないでしょうか。
ちなみに $b の部分は検索条件が何個でも対応できるようにしたいです。
どなたかお願いします、、、
532nobodyさん:02/08/26 16:36 ID:???
>>531
index連呼。
533nobodyさん:02/08/27 09:53 ID:???
>>532さん
index連呼ですか?
すいません。どのような意味なのでしょうか。。。

条件の数だけループして普通通り検索すると言うことでしょうか。
534533:02/08/27 09:58 ID:???
すいません。
文字列検索の index(STR,SUBSTR) ですね。
やはり単純にそれがよいのでしょうか。

index連呼で検索するのと
=~ // 連呼で検索するのは理論上はどちらが早いのでしょうか。
535nobodyさん:02/08/27 11:17 ID:C50HKFyh
>>534
まず試せば?

$a = 'sadfasfj犬okewrworwa';#含まれない
$aa = 'sadf柴asfj犬okewrworwa';#含まれる

use Benchmark;
timethese(300000,{
1=>q{if ($a =~ /(?=.*犬)(?=.*柴)/){$c = 0;}},
2=>q{if ($aa =~ /(?=.*犬)(?=.*柴)/){$c = 0;}},
3=>q{if(index($a,'犬') >= 0 && index($a,'柴') >= 0){$c = 0;}},
4=>q{if(index($aa,'犬') >= 0 && index($aa,'柴') >= 0){$c = 0;}}
});

#Benchmark: timing 300000 iterations of 1, 2, 3, 4...
#1: 13 wallclock secs (12.53 usr + 0.00 sys = 12.53 CPU) @ 23944.45/s (n=300000)
#2: 2 wallclock secs ( 2.60 usr + 0.00 sys = 2.60 CPU) @ 115251.63/s (n=300000)
#3: 1 wallclock secs ( 0.51 usr + 0.00 sys = 0.51 CPU) @ 588235.29/s (n=300000)
#4: 0 wallclock secs ( 0.97 usr + 0.00 sys = 0.97 CPU) @ 308959.84/s (n=300000)
536nobodyさん:02/08/27 11:36 ID:kyy6coMT
http://www2.freenet.jp/muneo/index.htm
超悪徳会社 J−COM(ジェイコム)の定期点検を大儀名文とした
勧誘営業に困っていませんか?
点検と言いつつ何もせず、結局はインターネット等の契約をして欲しい
の話へもっていく腐れ外道集団。
断ると「テレビの映りが悪くなっても知らんぞ」と脅迫メッセージをぶつけてくる。
苦情は総務省へ直接電話をすること。
マスコミはケーブルTVとは仲がいいので、テレビで取り上げることはまず無い。
2ちゃんねるパワーでジェイコムを追い詰めよう!!
537優香:02/08/27 18:39 ID:UTh7HsUo
の記述の中で『090』を禁止語句にするにはどうしたらいいのでしょう??

elsif ($email !~ /[\w\.\-\&]+\@[\w\.\-\&]+\.[\w\.\-\&]/){&error("メールアドレスが間違っています。");}
538nobodyたん:02/08/27 20:01 ID:???
とりあえず理解可能な日本語で書くように。
539呼んだ?:02/08/27 20:03 ID:???
 _γ⌒⌒ヽ
 \\ノハ)ヽ)∩
  (○) ´∀`ノ丿  / ̄ ̄ ̄ ̄
  ⊂二 y /   < マルチですー。
    / _二⊃  \____
 ⊂二ノ
540nobodyさん:02/08/27 21:39 ID:WUqkZoDp
>>537
まるちぃ〜ん
541はにゃーん☆:02/08/28 19:01 ID:???
From: =?ISO-2022-JP?B?xxxxxxxxxxxxx=?= <[email protected]>
From: [email protected]
上記のどちらの時でもメールアドレスだけを抜き出す方法を教えてください。
また、メールのヘッダー内の「From:」や「To:」は
これ以外の形で送られるときはありますでしょうか?
例えば
From: <[email protected]> =?ISO-2022-JP?B?xxxxxxxxxxxxx=?=
の様になっていることなど...
どのような形でも確実に(無理で有ればほぼ確実に)抜き出す方法を教えてください。
よろしくお願いします。
色々と試していたのですが
/^From: .*?([\w\+\-\.]+@[\w\+\-]+\.[\w\+\.\-]+).*$/
これで思い通りに抜けるのですが問題有りますでしょうか?
542はにゃーん☆:02/08/28 19:15 ID:???
大崎さんのperlメモを拝見させていただいたのですが、
下記のようでよいのでしょうか?
$mail_regex =
q{(?:[^(\040)<>@,;:".\\\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\\} .
q{\[\]\000-\037\x80-\xff])|"[^\\\\\x80-\xff\n\015"]*(?:\\\\[^\x80-\xff][} .
q{^\\\\\x80-\xff\n\015"]*)*")(?:\.(?:[^(\040)<>@,;:".\\\\\[\]\000-\037\x} .
q{80-\xff]+(?![^(\040)<>@,;:".\\\\\[\]\000-\037\x80-\xff])|"[^\\\\\x80-} .
q{\xff\n\015"]*(?:\\\\[^\x80-\xff][^\\\\\x80-\xff\n\015"]*)*"))*@(?:[^(} .
q{\040)<>@,;:".\\\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\\\[\]\0} .
q{00-\037\x80-\xff])|\[(?:[^\\\\\x80-\xff\n\015\[\]]|\\\\[^\x80-\xff])*} .
q{\])(?:\.(?:[^(\040)<>@,;:".\\\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,} .
q{;:".\\\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\\\x80-\xff\n\015\[\]]|\\\\[} .
q{^\x80-\xff])*\]))*};
$hoge = 'From: =?ISO-2022-JP?B?xxxxxxxxxxxxx=?= <[email protected]>';
$hoge =~ s/^From: .*?($mail_regex).*$/$mail=$1/e;
543nobodyさん:02/08/28 21:22 ID:???
>>541
多少削れる部分があると思いますが、特に問題は無い様に思います。

>>542
質問内容が解りませんが。
正規表現道場ですから、マッタりと待てば誰かが解析してくれるかも知れません。
544nobodyさん:02/08/29 00:30 ID:???
>>541
( ´,_ゝ`) プッ      
545nobodyさん:02/08/29 12:19 ID:???
>>544 は何しにこのスレに来てるのデスカ
546困ったヤシ:02/08/29 14:55 ID:???
あのぅ
すいませんが…
正規表現で困っています
『file "〜』か『FILE "〜』っていう
キーワードで検索したいんですけど
おながいしますた
547_:02/08/29 14:57 ID:???
>>546
/『file "〜』|『FILE "〜』/;
548困ったヤシ:02/08/29 15:01 ID:???
早速のレスですいやせんが
訂正と補足します。
grepで
from や FROM の次に半角の空白と"以外の
列を探したいのです
/[^from "]|[^FROM "]/;
では無理っぽいですた
549nobodyさん:02/08/29 15:04 ID:???
>>548
/form[^ "]/i
550困ったヤシ:02/08/29 15:12 ID:???
549さん
早速のレスはありがたや
なのですが…

from が form になってます…

出来ませんでした。
補足します秀丸でのgrepです

551困ったヤシ:02/08/29 15:38 ID:???
/from [^"]|FROM [^"]/;
でもだめれす…
お助けを
552nobodyさん:02/08/29 15:46 ID:???
秀丸なんて使ったことないよ。作ったヤシに聞けよ。秀 丸男だっけ?

っつーか、VIM使えよ
553困ったヤシ:02/08/29 15:47 ID:???
VIM?
554困ったヤシ:02/08/29 16:00 ID:???
教えてくださいヴぃあいえむを
555 ◆JAPH9PWA :02/08/29 16:34 ID:???
ほんとに困ったヤシだね
fileとかformとかfromとか…とりあえず言ってる意味がよくわからないので
どういうパターンなのか他人に分かるように説明してもらわないと
あと、秀丸のヘルプくらい読んでね


556困ったヤシ:02/08/29 16:38 ID:???
はいどうも困ったヤシです
fromとハンカクの空白とダブルクォーテーション以外の文字のキーワード
冷)from う
冷)FROM あ
なんかにひっかかってほしいんでしゅ
どうですかぁ?お客さん
557nobodyさん:02/08/29 16:48 ID:???
あのぅ
すいませんが…
正規表現で困っています
『困ったヤシ』を削除したいんですけど
s/『困ったヤシ』*?$//g;
では無理っぽいですた
558名無しさん@Meadow:02/08/29 17:12 ID:???
>>556
[from|FROM] [^"]
559名無しさん@Meadow:02/08/29 17:19 ID:r4ScsmNZ
>>557
s/『困ったヤシ』//g;
*?$って書くと、行末の『困ったヤシ』にしか対応線。
560nobodyさん:02/08/29 17:51 ID:???
>>558
(from|FROM)[^"] デショ
561nobodyさん:02/08/29 17:53 ID:???
>>560
( ´,_ゝ`) プッ   
562困ったヤシ:02/08/29 17:56 ID:???
キタ━━━━━(゚∀゚)━━━━━!!!!!
(from |FROM )[^"]
で逝きますた
563nobodyさん:02/08/29 18:13 ID:???
>>561
( ´,_ゝ`) プッ
564560:02/08/29 18:21 ID:???
その
( ´,_ゝ`) プッ
てやつやめてくれませんか。お願いします。
間違いがあるなら指摘しテク浅い。
565nobodyさん:02/08/29 18:24 ID:???
( ´,_ゝ`) プッ  だってさぁ、半角スペースがどこにも入ってないから
566nobodyさん:02/08/29 18:31 ID:???
( ´,_ゝ`) フーン
567困ったヤシ:02/08/29 18:32 ID:???
やめなよう
揉めごとはぁ。
(´Д`)ハァハァ
568困ったヤシ:02/08/29 18:45 ID:???
(´Д`)ハァハァ
569nobodyさん:02/08/29 18:47 ID:???
まぁ、質問者当人が喜んでいるので万事解決って事で。
570いらすま:02/08/30 21:33 ID:kfTl+oQS
性器表現

男性器→ おちんちん
女性器→ おまんこ
571nobodyさん:02/08/30 22:21 ID:???
で?
572nobodyさん:02/08/30 22:29 ID:???
URLで使用できる文字を教え頂きたいのですが、
英数字と;/?:@&=+$,-_.!~*'()] だと思うのですが、検索しても
見つかりませんでしたので・・・
573nobodyさん:02/08/30 23:09 ID:???
%
574名無しさん@Meadow:02/08/30 23:18 ID:???
>>572

perldoc -q url
575nobodyさん:02/08/31 07:19 ID:OvxGQyUv
576nobodyさん:02/09/01 16:35 ID:qOjuyzjx
577名無しさん@Meadow:02/09/04 03:47 ID:zyxWHEDD
jperlも[^2バイト文字]の場合、1バイト単位で処理するんですね。
sjisでは、全角記号は、ほとんど(全部?)\x81から始まっているので、
/[^※]+/とすると全角記号が入っている場合は合致しないんです。
この理解で合っていますか。
578 ◆dKHETt0c :02/09/04 13:06 ID:???
てすと
579nobodyたん:02/09/04 13:17 ID:???
580nobodyさん:02/09/05 01:39 ID:???
2ちゃんねるのIDはこれでいいですか?
^[A-Za-z0-9/]{8}$

PHPなんですけど
581nobodyさん:02/09/05 12:34 ID:qJJ4ywe1
「>」で始まってて「;」で終わっていたら、

「>」から「;」の前までの文字の色を青くして
「;」は消去したいんですが、

$hoge =~ s/(^>[.]);/<font color=blue>$1</font>/ig;

ではダメみたいです。

全角文字がいけないのか、半角のセミコロンはつかえないのか、
そもそもなにか間違ってるのかわかりません。

だれか正解を教えてください。
582581:02/09/05 12:39 ID:qJJ4ywe1
いろいろ間違いを見つけて

$hoge =~ s/(>.+);/<font color=blue>$1<\/font>/ig;

ここまで行きました。

まだ間違ってますか?
583nobodyさん:02/09/05 12:55 ID:87M5TYG6
>>582
英文字使ってないならオプションのiはいらんだろ。
.+? か [^;]+ にしないと>の後にセミコロンが複数あった時
最後のセミコロンまでの全ての文字がマッチしちゃうぞ。

$hoge =~ s/(>[^;]+);/<font color=blue>$1<\/font>/g;

あとタグを扱う場合は区切り文字変えた方が
/のエスケープ要らなくなって見やすい。
$hoge =~ s|(>[^;]+);|<font color=blue>$1</font>|g;
584 ◆4XfSMGTg :02/09/05 12:56 ID:???
>>580-582
( ´,_ゝ`) プッ
585581:02/09/05 13:46 ID:qJJ4ywe1
まだだめです
>あああ >おおお;

ってやると最初の>から;まで青くなってしまいます。
>おおお;
だけ青くしたいんです。
586nobodyさん:02/09/05 13:52 ID:???
>>585
あとから条件足すなボケ
587581:02/09/05 13:54 ID:qJJ4ywe1
$body =~ s/(>[^;^>]+);/<font color=blue>$1<\/font>/g;
すいません。わすれてました
でもこれで大丈夫のようです。

なぜか改行はいっても大丈夫(色がかわらない)のですが、なんででしょうか?
べつに変わらなくてよいのでいいんですけども、理由が気になります。
588nobodyさん:02/09/05 14:06 ID:???
while (<>){
$_ =~ s/(PAT)/$1/g;
}
とか
for (@foo) {
$_ =~ s/(PAT)/$1/g;
}
してるんなら、$_には読みこんだ一行しか入ってないから。
$/ = ''でもしとけ。

つか、全然正規表現じゃねーだろ。青らくだかって勉強しろボケ。
589nobodyさん:02/09/05 14:20 ID:???
>>588
あふぉですか?
590nobodyさん:02/09/05 14:21 ID:87M5TYG6
>>587
それじゃダメ。
>のコードは\x81\x84なので
[^;>]は[^;\x81\x84]と等価。ちなみに^は最初に一つ置くだけでいい。
つまり;か81か84が出てきたら全て否定されるので。81か84を含むコードを
持つ文字がある場合にマッチしなくなる。

こうしれ。
$hoge =~ s|(>(?![^;]+>)[^;]+);|<font color=blue>$1</font>|g;
591581:02/09/05 14:24 ID:qJJ4ywe1
>>590
ありがとう!

なぜか「→」とかの記号が中に入ると
ダメになっちゃったんだよ。

そういうことか。マジでありがとう!
ちなみに改行は大丈夫でした。記号が入っていたようです。すみませんでした。
592581:02/09/05 14:28 ID:qJJ4ywe1
>>590
・・・なにもマッチしないんですけど・・・。

なんでだろ。
593nobodyさん:02/09/05 14:36 ID:87M5TYG6
>>592
上の例だとマッチするが…
下記に確認に使ったソースを載せとく。

他に何か言い忘れてる事ある?
マッチさせたくてさせられなかった文字列はどんな?

#! /usr/local/bin/perl

print "Content-type: text/plain\n\n";

$hoge = '>あああ >おおお;';
$hoge =~ s|(>(?![^;]+>)[^;]+);|<font color=blue>$1</font>|g;

print "$hoge";
594581:02/09/05 14:40 ID:qJJ4ywe1
>>592
すいません
バッチリでした。
ちょっとぜんぜん関係ないところでミスってました。

本当に申し訳ありませんが、もうひとつだけ条件追加させてください。

>と;の間で改行したらマッチしないようにしたいです。
この場合の改行は<br>なので改行コードではないです。
だから簡単だと思ったのですが、「<br>」という文字列を丸ごと指定する方法が
わかりません。

こまった。
595nobodyさん:02/09/05 14:53 ID:87M5TYG6
>>594
$hoge =~ s%(>(?![^;]*(?:>|<br>))[^;]*);%<font color=blue>$1</font>%ig;

どこに<br>が入ってるかわかんないので+を*に変えといた。
ので、>;でもマッチしてしまうが。
596581:02/09/05 15:11 ID:qJJ4ywe1
まじで感謝です
>;でマッチするのはぜんぜんOKです。

ありがとうございました!
597nobodyさん:02/09/05 16:03 ID:???
2バイト目が81の文字の後に1バイト目が84の文字が続くと
>の部分にマッチしてしまう罠。
598nobodyさん:02/09/05 17:50 ID:???
>>597
( ´,_ゝ`) プッ アサハカさんですね
599nobodyさん:02/09/14 03:35 ID:ptF5alUd
$QUERY{'hd'}が「あ」だったら
あほ、あへへ、とかにヒットするようにしたいんですが、やり方わかりません。
if ($DB[$key] =~ /^$QUERY{'hd'}.*/) 〜
とかやってみました。ぜんぜんだめです。「{」は「\{」って書くんですか?
やってみたけどだめでした。どやってやったらいいですか。
600名無しさん@Meadow:02/09/14 08:27 ID:???
>>599
条件をもっと正確に書きましょう
「あほ、あへへ、とか」って?
$DB[$key]が「あ」で始まる任意の文字列にマッチする場合ということなら
if ($DB[$key] =~ /^$QUERY{'hd'}.*/) 〜
これでええです。
エラーをもっと正確に書きましょう
「ぜんぜんだめです。」って?
エラーメッセージを見ればほとんどのことは分かるんです

601nobodyさん:02/09/14 16:49 ID:???
^ はいらないんじゃない?
602名無しさん@Meadow:02/09/14 21:28 ID:???
>>601
$ perl -e '$var="abc"; if ($var=~/b/){print "601 is an aho!\n";}'
601 is an aho!
603名無しさん@Meadow:02/09/14 21:30 ID:???
$ perl -e '$var="abc"; if ($var=~/^b/){print "601 is an aho!\n";} else {print "
601 is God!\n";}'
601 is God!
604nobodyさん:02/09/15 00:00 ID:???
>>602 がah(略
605名無しさん@Meadow:02/09/15 07:34 ID:???
>>602, >>603はGod
>>604はdoah(略
606nobodyさん:02/09/16 22:01 ID:l9cfV4Lx
文字列置換で置換後に\1を参照した直後に1を挿入したいのですが、\11と書いたら
だめでした。どうやって書けばいいですか。よろしくお願いします。
$error_flags = "0000000000000";
$error_flags =~ s/^(\d{1})\d{1}(\d{11})$/\11\2/g if ($QUERY{'form_v2'} eq "");
$error_flags =~ s/^(\d{2})\d{1}(\d{10})$/\11\2/g if ($QUERY{'form_v3'} eq "");
607nobodyさん:02/09/16 22:10 ID:???
${1}1$2
608nobodyさん:02/09/16 22:16 ID:???
おお、なるほど。そんな書き方でしたか。やってみます。
どうもありがとうございます。
609nobodyさん:02/09/17 02:24 ID:QLf2zkHZ
3文字の数字のみにマッチをしているのですが、できません。

if($word=~/^[0..9]{3,3}$/){ print"ok";}

\dなど使わないでこの形式で正して下さい。
610名無しさん@Meadow:02/09/17 02:42 ID:???
>>609
相当の初心者さんですね
[0-9]{3}
611nobodyさん:02/09/17 03:51 ID:QLf2zkHZ
>>610
できた。できた。ありがとうございます。{3,3}でもできた。
612nobodyさん:02/09/17 08:17 ID:???
>>611
>{3,3}でもできた。
そりゃできるだろうけど、「3文字の数字」を探すときにわざわざ
「3文字以上3文字以下の数字」って書くのはちょっとね。
613nobodyさん:02/09/17 09:33 ID:???
少し前に、Web製作板のJavaScriptスレでも同じ質問があったな…
614nobodyさん:02/09/17 11:32 ID:???
>>610
なかなかの初心者さんですね
\d\d\d
615nobodyさん:02/09/17 12:25 ID:???
>>614
な(略)
\d{3}
616名無しさん@Meadow:02/09/17 12:33 ID:???
>>614, >>615
不合格!!
よく問題を読みましょう.
\dを使わずにやれとある
617nobodyさん:02/09/17 12:37 ID:???
なんてこっタ━━━━━(゚∀゚)━━━━━イ!!!!
618nobodyさん:02/09/18 11:38 ID:???
[0-9][0-9][0-9]
619nobodyさん:02/09/18 18:06 ID:???
[0123456789][0123456789][0123456789]
620nobodyさん:02/09/22 08:08 ID:GGE38Iwz
初心者ですいません。

12345 や 67890 や at41n や hyrdf985 や s4r などの文字列を

12 67 at hy s4

のように先頭の2文字だけに変換させるのはどうしたらよいでしょうー。
substr使えやゴルァ といわずに、正規表現でやってみたいのです。
何文字あるのかわからないため、...$ などは使えないし。
s/^..// なんてやると2文字だけ消えてしまうし、、
$_ = '1234567';
/(^..)/;
ってやれば、$_ = $1 でできるかもしれないけど、こんな手間かけるのもアレやし、、

s/先頭の2文字でない文字//;

とかやりたいの。
621名無しさん@Meadow:02/09/22 08:32 ID:t+76B0UP
>>620
s/(^..).+/$1/
じゃ不満?
622nobodyさん:02/09/22 08:39 ID:GGE38Iwz
>>621
それでもOKです、ありがとう!!!
でも、対象文字列が2文字でもOKです?
一応、対象となる文字列は「最低2文字はある」ということを前提にしてもよいです。

.+ って0文字でもよい?
623名無しさん@Meadow:02/09/22 08:43 ID:t+76B0UP
そならs/(^..).*/$1/だよね。
.+は1文字以上。

624nobodyさん:02/09/22 08:53 ID:GGE38Iwz
>>623
そうかー、さんきゅー助かった!
迷惑ついでにもうひとつ聞くけど、
substr使うより、正規表現使ったほうが処理早い?

「何文字かの文字列を先頭の2文字だけに変換する」
という処理を数千件行うんだけど、どっちが早い?
数千件程度じゃあんまり変わらんかw
625名無しさん@Meadow:02/09/22 09:03 ID:t+76B0UP
>>624
死らん。やってみて報告キボンヌ。
$start=time();
while(<>) {
s/(^..).*/$1/; #または、substr($_, 0, 2);
}
$end=time();
print $end-$start, "\n";

626nobodyさん:02/09/22 09:11 ID:GGE38Iwz
>>625
数千件と言いながら3357件しかないので、
たいして変わんなかったw
期待はずれスマソ

627名無しさん@Meadow:02/09/22 09:12 ID:t+76B0UP
>>642って書いたけど、その後の処理の内容が問題じゃん。
s///は$_が変化している。substrはそのまま。
$_にさらに処理を加えるなら、s///にしなきゃだめだけど
最初の2文字出すだけならprint substr...の方が早いっしょ。
628nobodyさん:02/09/22 09:20 ID:GGE38Iwz
>>627
そかそか、勉強になった、さんくすコ
629nobodyさん:02/09/22 19:02 ID:???
正規表現は基本的に遅いよ。
他のやり方でやろうとすると数行並べなきゃならなくなるような
処理なら素直に正規表現使った方が速くなることもあるけど。

use Benchmark;
timethese(500000,{
1=>q{
$hoge = '123456789';
$hoge =~ s/^(..).*/$1/;
},
2=>q{
$hoge = '123456789';
$hoge = substr($hoge,0,2);
}
});
Benchmark: timing 500000 iterations of 1, 2...
1: 20 wallclock secs (20.69 usr + 0.00 sys = 20.69 CPU) @ 24167.43/s (n=500000)
2: 3 wallclock secs ( 3.55 usr + 0.00 sys = 3.55 CPU) @ 141003.95/s (n=500000)
630名無しさん@Meadow:02/09/23 10:25 ID:???
>>629
べんきょになりましたm(__)m
631nobodyさん:02/09/23 14:48 ID:???
JRE32v1.17で

std::string
string
std::vector
vector

にヒットする正規表現がわかりません・・・

(std::)?string|vector

だと、std::が付いてないヤツにヒットしないです
632nobodyさん:02/09/23 14:50 ID:???
(std::|)?string|vector













633631:02/09/23 14:54 ID:???
>632
そ・・・そんな単純な事なのか・・・
ありがとうございました
634名無しさん@お腹いっぱい。:02/09/24 23:42 ID:???

きっと誰かやってると思うんだけど、日本語を含む文字列中の , . など
区切り文字を空白に置換する正規表現を教えてください。
できれば、。「 」なんかもできるといいです。
635nobodyさん:02/09/24 23:58 ID:???
>>634
tr/,./ /;
s/\x81[\x40-\x42]/ /g;#SJIS
636nobodyさん:02/09/25 00:03 ID:???
s/\x81[\x40-\x42]|[^\x81-\x9f][,.]/ /g;#SJIS
637nobodyさん:02/09/25 00:11 ID:???
>>636
( ´,_ゝ`) プッ
638636:02/09/25 00:13 ID:???
あ、いろんな意味でダメだこれ。
639名無しさん@お腹いっぱい。:02/09/25 00:16 ID:???

>635-636
すみません。EUC-JPなんです。
とりあえず、JIS X 208の01-03区は記号っぽいので、
tr/,./ /;
s/[\xA1-\xA3][\xA1-\xFE]/ /g;
とやってみましたが日本語が化ける場合があります。
640637:02/09/25 00:25 ID:???
では、わたしから

s/[.,]|\xa1[\xa2\xa3\xd6\xd7]/ /g;
641nobodyさん:02/09/25 00:42 ID:???
>>640
「◆□」とかの\xa2\xa1\xa2\xa2みたいに並んだ文字で誤変換するぞ
642nobodyさん:02/09/25 00:47 ID:???
区の指定と点の指定を区別せにゃならんな。
643637:02/09/25 00:58 ID:???
そこまで完璧に処理するとなるとオーバーヘッドがでかくなるんでないかな
一応以下のやつではどうだ?(16進と8進がいりまじってるけどきにするな)

s/([.,]|\xa1[\xa2\xa3\xd6\xd7])|(\216[\241-\337]|\217?[\241-\376].|.|\n)/$1?' ':$2/ge;
644nobodyさん:02/09/25 01:05 ID:???
645名無しさん@お腹いっぱい。:02/09/25 01:50 ID:???

>>640-644
レスありがとうございます。
>>644のリンク先に書いてある方法で、
s/\G((?:$ascii|$twoBytes|$threeBytes)*?)(?:[\x20-\x2F\x3A-\x40\x5B-\x60\x7B-\x7F]|[\xA1-\xA3][\xA1-\xFE])/$1 /g;
でうまくいきそうです。
646nobodyさん:02/09/29 19:27 ID:knautRXm
URLに使える文字がエスケープされていたら(%7Eとか%2Eとか)
元に戻す( ~ とか . とかに)という処理を正規表現で行えますか?
647nobodyさん:02/09/29 19:35 ID:???
(゚д゚)ハァ?
URLデコードで検索しろや。
648nobodyさん:02/09/29 20:32 ID:knautRXm
URLデコードだとデコードしたら意味が変わる文字までデコードしちゃうじゃないですか。
安全にデコードできるパターンだけを元に戻したいんですけどそういう判定を
正規表現でできますか? という質問。
649nobodyたん:02/09/29 21:46 ID:???
>>648
できる。
650nobodyさん:02/09/30 09:51 ID:???
>>648
ふつーは単純にURLでコードすりゃいいだろ。
何か特殊な事情があるならやりたいことを詳しく書け!
651nobodyさん:02/09/30 12:56 ID:???
>>648
指定が面倒そうだから一度エンコードしてデコードし直せば?
s/%([a-f\d]{2})/pack("H2",$1)/ieg;
s|([^\w/\.&%?~+=:@#\-])|'%'.unpack("H2",$1)|eg;
652651:02/09/30 12:58 ID:???
違う、デコードしてエンコードし直す、だな。
653nobodyさん:02/10/01 01:46 ID:m9+B5ZAC
>>650
URLを同一性チェックのために正規化したいんです。
>>651
それだと最初はエンコードされてなかった / とか # とかも
エンコードされてしまいまつ…
654nobodyさん:02/10/01 01:57 ID:???
>>653
意味わかって言ってる?
>>651のは「\w/.&%?~+=:@#-」以外の文字をエンコードするって
意味だぞ。
655nobodyさん:02/10/01 10:50 ID:???
>>654
ごめん '[' とか ']' とかが、とでも読み替えてください
656nobodyさん:02/10/01 10:56 ID:???
ていうか最初は %2F にエンコードされてた / が
デコードされてしまうのでやっぱり困ります。
同一視されては困るからエンコードしてるのに
区別がつかなくなっちゃう。
657nobodyさん:02/10/01 12:21 ID:???
>>656
だから意味考えろって。
'[' ']'をエンコードさせたくないなら[^〜]の中に
\[\]を加えればいいだけだろ。
/はエンコードしたいなら[^〜]の中の/を外せばいいだろ。
お前の頭にゃ何が詰まってんだ?
エンコードしたくないものを[^〜]の中に並べるだけ。
>>651のはただの一例だろ。実際に何を並べるかくらい自分で考えろ。
658nobodyさん:02/10/01 12:31 ID:???
>>656
同一視って、何と何が?
659nobodyさん:02/10/01 12:35 ID:???
>>656まずは例を出してみようよ。この文字列を
このようにしたい、って感じで。

君の説明わかんないよ。
660nobodyさん:02/10/01 12:48 ID:???
>URLに使える文字がエスケープされていたら(%7Eとか%2Eとか)
>元に戻す( ~ とか . とかに)という処理を正規表現で行えますか?

>ていうか最初は %2F にエンコードされてた / が
>デコードされてしまうのでやっぱり困ります。

このへんが特にわからないね。
URLで使える文字を戻したいんじゃ無かったのか?
661nobodyさん:02/10/01 12:59 ID:???
質問しとる方も何がしたいのかわかってないんちゃうか?
662nobodyさん:02/10/01 15:00 ID:???
>>657-660
最初が「/%2F」なら「//」でも「%2F%2F」でもなくて
「/%2F」のままなるようにしたいんです。文字クラスに
足したり引いたりするだけでそんなこと出来ますか?
「~%7E」は「~~」にしたいです。
そのままにしたい文字(「/」のような)と統一したい文字
「~」のような)を区別する基準は、RFC2396のunreservedに
含まれるか否かです。

たとえば「/%7Ehoge」と「/~hoge」は同じURIだから、
この変換を掛けた後はどちらも同じ文字列にしたいけど、
「a/index.html」と「a%2Findex.html」は違うURIだから
同じになっては困るということです。
663nobodyさん:02/10/01 15:42 ID:???
>>662
my %reserved = map { unpack('H2',$_) =>1 } qw(; / ? : @ & = + $ ,);
s/%([0-9A-Fa-f][0-9A-Fa-f])/$reserved{lc $1}?"%$1":pack('H2', $1)/eg;
こんなとこか?
664nobodyさん:02/10/02 03:14 ID:???
>a%2Findex.html
このURL自体がありえないと思う。
665nobodyさん:02/10/02 12:06 ID:???
>>664
Mac OS 9のサーバなら十分にありうる。
RFC 2396的にも別に禁止されてない。
666nobodyさん:02/10/02 12:07 ID:???
つか / が気に入らないなら別の文字当てはめてみろよ。
# と %23 が同一視されたらまずいのは明らかだろ。
667nobodyさん:02/10/06 00:18 ID:uZEZ57G8
もっとも後ろにある , 以降の文字列を削除する正規表現を教えてください。


12345,67890,12345,67890 → 12345,67890,12345
aaa3,5567,3333333,aser567 −> aaa3,5567,3333333
dser6f,ghhs,,asfa,wfdw,,,,asf -> dser6f,ghhs,,asfa,wfdw,,,
668nobodyさん:02/10/06 00:21 ID:???
s/,[^,]*$//;
669nobodyさん:02/10/06 00:36 ID:???
>>668
thx
670nobodyさん:02/10/06 01:34 ID:uZEZ57G8
連カキスマソ。
6個目の , 以降の文字列を削除する正規表現について。


11111,22222,33333,44444,55555,66666,77777
 → 11111,22222,33333,44444,55555,66666

11111,222,33333,4444444,55,6 → (これはそのまま)

,,,,,,,,,,11111 → ,,,,,

この正規表現を作ってみたんですが

s/([^,]*)(,[^,]*)(,[^,]*)(,[^,]*)(,[^,]*)(,[^,]*).*/$1$2$3$4$5$6/;

もっとスマートな書き方ありませんか?
671nobodyさん:02/10/06 01:49 ID:???
s/([^,]*,[^,]*,[^,]*,[^,]*,[^,]*,[^,]*.*/$1/;
672nobodyさん:02/10/06 01:49 ID:???
括弧を消しすぎた
s/([^,]*,[^,]*,[^,]*,[^,]*,[^,]*,[^,]*).*/$1/;
673nobodyさん:02/10/06 02:10 ID:???
s/^((?:[^,]*,){5}[^,]*).*$/$1/;
674nobodyさん:02/10/06 02:12 ID:UBZ5BN7L
chop($st = $1) if $st =~ /^((.*?,){6})/;
とか。
675名無しさん@Meadow:02/10/06 02:15 ID:???
>>674
くそ、さき越された。早く寝ろてめえら。
676hmk:02/10/06 02:15 ID:???
>>674
キャ〜カッコイイ!!
677nobodyさん:02/10/06 02:18 ID:uZEZ57G8
>>674 の案を頂き。thx
678名無しさん@Meadow:02/10/06 02:35 ID:???
>>674
しかしだな、
$st =~ s/^((.*?,){6}).*/$1/;
の方が普通やね。やっぱ、俺の方が(略
679nobodyさん:02/10/06 02:41 ID:???
>>678
末尾に残るカンマの処理はどうお考えで?
680名無しさん@Meadow:02/10/06 02:53 ID:???
>>679
む、やっぱ、あんた=>>674?の方が(略
681nobodyさん:02/10/06 02:57 ID:QWnMytEq
サクラエディタで、JSP/ASPのスクリプト部分を色指定しようと試しているのですが巧くいきません。
<%.*%>でオーケーとか軽く考えていたのですが、.は改行文字にはマッチしないのですね。
改行文字も含めてとにかく全部マッチさせるにはどうしたらいいのでしょうか?

#サクラスレではレスが付きませんでした(T_T)
682nobodyさん:02/10/06 03:16 ID:???
>>681
改行コードに色は付きません。
改行コードの正規表現は、
windows: \r\n, unix: \n, Mac]\r
です。
683nobodyさん:02/10/06 03:17 ID:???
あ、×Mac]\r -> ○Mac: \r
684nobodyさん:02/10/06 03:25 ID:???
htmlで改行コードを表示するんなら、682、683で書いた
ものに代替文字を当て、そいつに色タグを付けるようにしる。
685nobodyさん:02/10/06 03:53 ID:QWnMytEq
>>682
ごめんなさい、ちょっと書き方が悪かったですね。
<%.*%>と指定しても、<%と%>に挟まれた文字に色がつかないんです。
それで、改行が挟まっているのでマッチしないのか、と思い>>681を書いたのですが……

私、根本的に間違っているのでしょうか?(^^;
686nobodyさん:02/10/06 04:07 ID:???
>>684
そいじゃ、「改行文字も含めてとにかく全部マッチさせる」じゃなくって
「改行文字を除いた部分にマッチさせる」じゃねーかよ。日本語大丈夫?
<%.*%>の中に改行が入っているかどうかなんて見れば分かるだろ。
それが確かに原因だと確かめられてから質問しろ。改行を挟む文字列を
連結するにはどうすればいいですかってな。
質問の仕方じゃ、どっかでレスが付かなかったのも当然だよ。


687nobodyさん:02/10/06 04:31 ID:???
/<%.*%>/s;
とかいうレベルの話じゃないの
688nobodyさん:02/10/06 04:34 ID:???
質問の仕方じゃ→こんな質問の仕方じゃ
我はもう寝る
689nobodyさん:02/10/06 04:35 ID:???
ってPerlじゃないのか
690nobodyさん:02/10/13 00:14 ID:w3kn3Su/
Perlの正規表現で
0から始まらない数字だけの文字列
ってどう表現すればいいですか?
※001とか0930とかは駄目ってことです。
691nobodyさん:02/10/13 01:08 ID:???
/^[1-9]\d*$/
692690:02/10/13 01:19 ID:w3kn3Su/
↑あーなるほど!
ありがとう!
693nobodyさん:02/10/13 16:39 ID:PvvO3hVH
%cat hoge.txt
人数:5725 過去のイベント

から
5725をとるのに
sed -e 's/.*://' hoge.txt |perl -pe 's/\s+.*//;'
としてますが、perlで一つの正規表現でやりたい
694nobodyさん:02/10/13 16:41 ID:???
/人数:(5725) 過去のイベント/;

なんと $1 にセットされます。
695 ◆gst6v8LC9k :02/10/13 18:40 ID:???
ユーザが入力したURLの中に
../
がはいっているとイヤです。取り除きたいと思います。
一方、
.. や / は取り除きたくありません。

単純に、
../ を消す正規表現を採用したところ、
たとえば
..././ を入力されたときに、
../ が残ってしまいます。

何か良い知恵はありませんか?

696 ◆gst6v8LC9k :02/10/13 18:42 ID:???
なくなるまでぐるぐるまわさなきゃダメでしょうかねぇ?
697nobodyさん:02/10/13 18:52 ID:???
1 while s/\.\.\///;
698nobodyさん:02/10/13 21:54 ID:???
>>697
何で?s/\.\.\///g;でいいじゃん。
699nobodyさん:02/10/13 22:01 ID:???
>>698
$_= '..././aaa';

これの実行結果を見てみ
700698:02/10/13 22:10 ID:???
>>699
 (;´Д`)  スミマセンスミマセン
 (  八)
   〉 〉
701nobodyさん:02/10/14 02:49 ID:???
いやそれより
..././aaa

aaa
になるのは正しいのか?
.../aaa
にならなきゃならないと思うんだが。
702nobodyさん:02/10/14 03:01 ID:???
ああユーザーの入力から取り除きたいってことか
2ちゃんねるの&rlo;対策も>>698と同じ罠にはまってたなそういえば
703698:02/10/14 11:30 ID:???
>>695の問題設定に矛盾あり。
../を取り除きたいと/は取り除きたくないとの両立は不可能。
ネタか?
704nobodyさん:02/10/14 15:40 ID:???
../ 以外の場所に出現する / は取り除きたくないってことでしょ。
つまり ../a/b..c は abc じゃなくて a/b..c にしたいと。
705698:02/10/14 16:01 ID:???
じゃあだよ、..../..././は?
第1っ回目で..../となり2回目で..かい?
どういう意味があるのかいまだ和歌ら図・・
706nobodyさん:02/10/14 16:06 ID:???
それ以前に..../..././にどういう意味が・・・
707698:02/10/14 16:17 ID:???
>>706
あっしに言ってんの?
じゃ、.../..././でもいいよ。
これは、.になっちゃうよね。それに何の意味があるのって聞いてんの。
708698:02/10/14 16:18 ID:???
>>706
>>701が言ってることに答えくれればいいんよ。
709 ◆qOV1uU.npY :02/10/14 16:32 ID:???

名前を失念したので、うまく◆gst6v8LC9k になるかどうか不明ですが
695です。失礼しました。皆さんお知恵をありがとうございます。

結局、以下を使う事にしました。
while($blah =~ /\.\.\//){ $blah =~ s/\.\.\///; }

まだ良く読んではいませんが、以下をこれから勉強してみようと思います。
http://b0iler.eyeonsecurity.org/tutorials/perlfilters.htm

710 ◆gst6v8LC9k :02/10/14 16:36 ID:???
こっちだったかなぁ?名前。695です。

ところで、709でのリンクは今さっき見つけたのですが
関連するページを語如語如していましたら、以下のページが親ページ
だったみたいで。
http://b0iler.eyeonsecurity.org/tutorials/hackingcgi.htm

(名前、失敗したら次からは695です、と言おう)
711nobodyさん:02/10/14 17:13 ID:???
このお題はかなり勉強になったと個人的に思う。
用はこれ
&rl&rlo;o;
にどう対処するかってことだよね。
早速自分の掲示板書き換えてきます。
712nobodyさん:02/10/14 17:15 ID:???
>>711
まずった。
これね
&rl&rlo;o;
713218-228-157-71.eonet.ne.jp:02/10/14 17:53 ID:u7YCuldt
(;´Д`)ハァハァ
714nobodyさん:02/10/14 18:26 ID:???
ここはCGIの話をするところではありません。
>>709->>712は早急に立ち退いてください。
715nobodyさん:02/10/14 19:00 ID:???
はい、次々ぃ!

与えられた文字の並びの中から、
UUENCODEでファイルの記述になっている部分【だけ】を
正規表現でネグるやり方はありますか?

これ、テキストメールでOEユーザあたり宛に、ファイル送るときに
便利ですが。フィルターするならどうします?

掲示板に投稿されたテキストが、まんま、掲示板管理者に送信される
ケースで、事故が発生したことがあります。ちなみにOTDの掲示板で。
今は対処済みのようなんですが、いったいどうやったんだろうと不思議で。

716nobodyさん:02/10/14 19:21 ID:???
>>715
「UUENCODEでファイルの記述になっている部分【だけ】を」
日本語がはっきりしませんが、uuencodeされた部分は、beginn
とendで境界付けられています。
717nobodyさん:02/10/14 23:51 ID:???
1.undef $/;$while_lines=<>;
2.@lines=<>;
perlを1.2.のような使い方で
a
b
c
d

a\tb
c\td
にするにはどのように書けばいいでしょうか。
s/\n/\t/;
と書く場合、
置換される回数を指定できればやりたいことが実現できるのですが、
そういう手段perlはs演算子に用意されていないと思います。

他の手段でも構わないので、何かアドバイスありませんか?

718nobodyさん:02/10/15 00:00 ID:???
s/\n(.*\n)/\t$1/g;
719nobodyさん:02/10/15 00:13 ID:???
>>717
undef $/;
$line=<>;
$line =~ s/((.+?)\n(.+?\n))/$2\t$3/g;
print $line;
720719:02/10/15 00:16 ID:???
>>718の方がおり降参でした。

721719:02/10/15 00:35 ID:???
でも、漏れだったら、
while(<>) {
chomp;
if ($. % 2) {
print $_, "\t";
} else {
print $_, "\n";
}
}
かなぁ。
722nobodyさん:02/10/15 00:48 ID:???
>>721
しょぼいコードだな
723719:02/10/15 00:59 ID:???
じょぼくて悪かったな。
実は自分でもしょぼいなぁと、>>717はいい質問してくれたなぁと。
724717:02/10/15 01:52 ID:???
あ、実は
a b c
d e f
g h i
j k l
とかも作る必要があったので、721のものが一番
良かったかも。

汎用性?
725719:02/10/15 02:04 ID:???
>>724
あんた優しいね。好きっ
726nobodyさん:02/10/15 02:53 ID:epeKbC4J
携帯アドレスはハネない程度に厳しいメアド判定教えて!
727nobodyさん:02/10/15 03:22 ID:???
@以下のアドレスに対して、whois
728726:02/10/15 10:55 ID:Hi0tGOTs
>>727
正規表現のみでひとつ
729nobodyさん:02/10/15 11:00 ID:LkwD4Abx
>>726
/[-_.a-zA-Z0-9]+@(?:[-a-zA-Z0-9]+\.)?[-a-zA-Z0-9]{3,63}\.(?:[a-z]{2,}\.[a-z]{2}|[a-z]{2,})/
730nobodyさん:02/10/15 12:28 ID:???
誰っかー。助けてください。
某サイトでお願いして書いてもらったソースコードを実行するたびに、
掲示板が勝手に改行いれるので、それを消し去る正規表現を書きたいです!!!

規則は:
1.全ての行は本来ならスペースやタブで始まる
2.勝手に改行されていた行は先頭(^)から始まる
3.本来なら、各行の先頭は大文字である
4.勝手に改行されていた行は先頭が小文字である

ぐらいかな〜。


具体例:
    Cells.Find(What:="場所", After:=ActiveCell, LookIn:=xlValues, Look
At:= _
xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchC
ase:=False) _
.Activate
のような感じです。お願いしました。
731730:02/10/15 12:30 ID:???
あ、
3.本来なら、各行の先頭は大文字である
4.勝手に改行されていた行は先頭が小文字である
には例外があるみたいです。

御願いしましたよ。
732nobodyさん:02/10/15 14:22 ID:???
*は全て半角数字です。「-」は文字としてのハイフンです。
文字のパターンは、
1:****** # 文字数未定の1文字以上の半角数字
2:***-*** または、 ***-***-***  # 文字数は未定の数字のあとにハイフンが入ります。
ハイフンは1個の時と、2個付くときがあります。

例)12344556 、 32-98 、 45-98-35

これらの正規表現をお願いします。
自分で考えたのは
([0-9]+[[\-[0-9]+]?[\-[0-9]+]?) これです。
一応成功するんですが、**-**-**-** こうやっていくつも続いた時も
マッチしてしまいます。基本的に**-**-**という風に三回しか繰り返しません。
修正があればお願いします。
733nobodyさん:02/10/15 14:26 ID:???
すいません、正しいのはこれです。
([0-9]+[\-[0-9]+]?[\-[0-9]+]?)/mg)
734nobodyさん:02/10/15 14:29 ID:???
/^(?:\d+-){0,2}\d+$/;
735nobodyさん:02/10/15 19:18 ID:???
>>715
$in{$_} =~ s/^begin 0{0,1}[0-9]{3} (?:(?!\nend).)*(\nend)/UUENCODED-BINARY/gs;
$in{$_} =~ s/\nbegin 0{0,1}[0-9]{3} (?:(?!\nend).)*(\nend)/\nUUENCODED-BINARY/gs;

うちではこうだけど。でも取り除き漏れがあるかな?うぅーん。
736726:02/10/16 21:41 ID:lp+sZlkX
>>729
ありがとう
737nobodyさん:02/10/17 02:55 ID:???
sage
738nobodyさん:02/10/18 23:47 ID:???
正規表現で、
日本語のひらがな一文字だけマッチさせるのって出来るのですか?
739nobodyさん:02/10/18 23:51 ID:???
でっ、できちゃう
740nobodyちゃん:02/10/19 01:06 ID:???
>>738
jperlなら、[ぁ-ん]
perlなら、sjisの場合、\x82[9F-F1]、
eucの場合、A4[A1-F3]、jisの場合、24[21-73]、utf8の場合、30[41-93]

741nobodyちゃん:02/10/19 01:08 ID:???
おや、16進数を表す記号を付け忘れたし。
perlなら、sjisの場合、\x82[\x9F-\xF1]、
eucの場合、\xA4[\xA1-\xF3]、jisの場合、\x24[\x21-\x73]、
utf8の場合、\x30[\x41-\x93]
742nobodyさん:02/10/19 13:03 ID:???
ココ見てる人なら、知ってるかも。

HTMLの<TABLE>〜</TABLE>をCSVとかTSVとかに変換できますか?

table2csv.pl
なんてのがあるわけがないと思って質問シマスタ。
w3m -dump はへんな線が入るので、使いたくないし、CSVが勝つよう範囲も
広そうなので、だれか書いていてもよさそう。


とっても困ってます。

743738 :02/10/19 13:16 ID:???
>>740

perl(jperl and perl5.8)の
s/あ/ア/;
tr/あ/ア/;
の違いってわかりますか?

たぶん、知ってそうだから。ごめんね。
744742:02/10/19 13:36 ID:???
http://www2.crl.go.jp/jt/jt221/tfujii/Installer/table2csv.txt
になんかそれっぽいものあるけど
動かない。

理由わかる人いますか?
745nobodyさん:02/10/19 14:01 ID:???
>>744
こりゃあ、ひどいな・・・
746nobodyさん:02/10/19 15:15 ID:???
>>744



ほれ。区切りはawkだから-F","とかね。


BEGIN { print "<table border=\"1\">";}

{
print "<tr>";
for (i=1; i<=NF; ++i){
gsub(/&/,"\\&",$i);
gsub(/</,"\\<",$i);
gsub(/>/,"\\>",$i);
print "<td>" $i "</td>";
}
print "</tr>\n";
}

END { print "</table>";}
747744 :02/10/19 17:19 ID:???
>>746
csv2table.awkではなく
table2csv.awk

が欲しいのです。

748744:02/10/19 18:08 ID:???
どれくらいのテーブル? どでかいの?
749744:02/10/19 18:39 ID:???
ちっちゃいですよ。すごく。
750nobodyさん:02/10/19 18:44 ID:???
>>744
ファイルから読み込むならまず最初に全部変数に読み込め
751nobodyさん:02/10/19 21:52 ID:???
>>742
colspanとrowspanが指定されてるのってどうするかとか、
仕様が決まれば、すぐ書けるよ。特にrowspanね。
caption、thead、tfootどうするかは、たいした問題じゃ
ないな。
libraryやmoduleがないのは、余りにも簡単だからだよ。
perl初心者コーナーで質問したら書いてくれる人いっぱい
いたのにぃ。
752nobodyさん:02/10/19 22:08 ID:???
>>751
colspan や rowspan があるテーブルはどうやってCSV変換するんだ?
753nobodyさん:02/10/20 11:10 ID:???

例えば、
┌─┬─────┬─────┐
│ │  人間  │  猿  │
│ ├──┬──┼──┬──┤
│ │ 男 │ 女 │オス│メス│
├─┼──┼──┼──┼──┤
│x │ 1.9│ 2.3│ 1.3│ 1.8│
├─┼──┼──┼──┼──┤
│y │ 0.8│ 0.4│ 0.4│ 0.2│
└─┴──┴──┴──┴──┘
だったら、
"," (row: 2)","人間 (cols: 2)","人間 (cols: 2)","猿 (cols: 2)","猿 (cols: 2)","
"," (row: 2)","男","女","オス","メス","
","x","1.9","2.3","1.3","1.8","
","y","0.8","0.4","0.4","0.2","
こんなふうにするスクリプト。改行多くて1レスにならんから、次レスへ。
754nobodyさん:02/10/20 11:10 ID:???
>>753の続き
while(<>) {
chomp;
$flg = 0;
$col = 0;
$line = $_;
$line =~ s/(<\/*thead>|<\/*tfoot>)//gi;
$line =~ s|</*tr.*?>||gi;
for $i (0 .. $#row_max) {
undef $row_data[$i] if $. > $row_max[$i];
}
while($line =~ /<(td|th)/) {
$flg = 1;
$col++;
$line = "$'$row_data[$col]$&$`";
if ($line =~ s|<t[dh][^<]+?rowspan.+?(\d+).+?>(.*?)</t[dh]>|"\",\"" . $2 . " (row: " . $1 . ")"|ei) {
$row_data[$col] = "<td>$2 (row: $1)</td>";
$row_max[$col] = $. + $1;
} elsif ($line =~ s|<t[dh][^<]+?colspan.+?(\d+).+?>(.*?)</t[dh]>|("\",\"" . $2 . " (cols: " . $1 . ")") x $1|ei) {
1;
} else {
$line =~ s|<t[dh][^<]*?>(.*?)</t[dh]>|","$1|i;
}
}
print "$line\",\"\n" if $flg == 1;
}
しっかり試してないからバグが潜んでいるかも。
755nobodyさん:02/10/20 20:19 ID:???
>>744, >>752
せっかく求めに応じて書いたのに。何の反応もない。
2chだってある種の礼儀はあるだろうに。
756744:02/10/20 22:50 ID:???
>>753
おおおお、そんな複雑なことまで出来るのですね。
ほんとに有難うございました!!!
勉強になりました。

今、http://hywr.kuciv.kyoto-u.ac.jp/~shiiba/documents/unix/openmemo.html#3
のtabel.elなるものを見つけましたが、スクリプト自体は落とせませんでした。

以前これを落とされた方いますか?


757nobodyさん:02/10/21 00:26 ID:???
>>756
「勉強になりました」とか言ってほんとはありがた迷惑ってやつだろ?
だって使えそうにないもんな
758nobodyさん:02/10/21 01:02 ID:???
>>757
どこがどう使えないか言ってみろ。
759nobodyさん:02/10/21 12:36 ID:???
$line =~ s/(<\/*thead>|<\/*tfoot>)//gi;

テーブルにこんなタグあんのか?
760nobodyさん:02/10/21 12:47 ID:???
書いた本人じゃなくて悪いけどさ、
>>759
あるぞぉ。

ちなみに、tr/th/tdタグって閉じなくてもいいわけだから、汎用的に使う場合に
はちょっと問題出そうな気がするんだけども。
761 ◆hMJAPH9PWA :02/10/21 12:49 ID:???
>>759
あるよ。あとtbodyね。省略可能だからあまり見ないのかも。
762nobodyさん:02/10/21 13:17 ID:???
>>754
そのコードは無限ループに陥る可能性が・・・
763nobodyさん:02/10/21 14:31 ID:+QmxDt3y
他は大丈夫なのに、
何故か全角のスラッシュだけが置き換えされません・・
なんででしょうか?
$_ =~ s////g;

これでいいんですよね?
764nobodyさん:02/10/21 15:06 ID:???
ほら見ろ、どこにも欠陥がないじゃねーか。
>>763
まず、lintで正しいhtmlかどうか確認しましょう。
>>762
ちなみに、あんたの予測ではどういう時に無限ループに陥る?
>>761
tbodyでtd、thと同じ行で共存しないでしょ。
$flg==1のとき(その行にtdかthがある場合)しか出力してないから
tbodyは無視していいのです。<\/*tfoot>の削除も実は不要だった。
>>760
<\/*thread>ってなってるでしょ。閉じはあってもあくても対応できるよ。
だれも書いてないことは、<tr>...</tr>の行が一行毎に改行されてない
のにかけたら、まったくだめだよってこと。その前処理を付ければ、
すばらーしスクリプトだな。

765nobodyさん:02/10/21 15:49 ID:???
>>760
おっとうっかりしてた。
</*thead>とかじゃなくて、tr,td,thか。
それが閉じてないとやばいね。多分、lintには叱られるhtmlの書き方
だろうけど。それに対処するには、td,thのばやいは、次のtd,thか、改行まで、
trはもともと削除しちゃってるんだから関係ないと。
だから、上のスクリプトに
s#</t[dh]>#(</t[dh]>|<t[dh]>|$)#g;
すればいいっつことだな。
766nobodyたん:02/10/21 18:17 ID:???
>>717
乗り遅れたが...

while(<>){
s/(.*?)[\r\n]*$/$1."\t".<>/es;
print;
}

ってのはどう?
767nobodyさん:02/10/21 23:29 ID:pPxXD5oZ
恐ろしく厨な質問で恐縮なのですが・・・
一文字前が改行以外の「,」を検索することは
正規表現で出来るのでしょうか?
VBScriptの正規表現オブジェクトを使ってます。
[^\t\n],
だと改行が前に無い「,」とその一個前が取れてしまって・・・。
重ね重ね厨ですみません。。
768nobodyさん:02/10/21 23:31 ID:???
あ、上の [^\r\n], です。すみません・・・。(鬱
769主婦のサークルで〜す:02/10/21 23:55 ID:Ah6hwMht
ほんの少し刺激を求めてる主婦のサークルを作りました!
私たち主婦が楽しめる安全でちょっとトキメキのある出会を求めて
只今男性会員を募集中です!! 女性会員も募集(^○^)/"
http://f-cc.com/~tokimail/
770762:02/10/22 00:35 ID:???
>>764
以下の2行のごく単純なテーブルで実行してみれば?

<table><tr><td
bgcolor="White">hoge</td></tr></table>

あと、念のために聞くけどCSVって知ってる?
771nobodyさん:02/10/22 02:45 ID:???
>>766

これって改造して、3列バージョン作れますか?
772nobodyさん:02/10/22 05:13 ID:???
>>764
ちゃんと人の書いてること読んでから書き込め。
<tr>...</tr>の行が1行ごとに改行されてるtableが前提だ。
前処理もすぐに書けるが書いてないといってる。
お前のおかげで貴重な資源が無駄になった。もう2chには来るな。
おまえはCSVに何種類かあるか知ってるのか?漏れの出したの何ていう
名前のCSV? Kで始まるよ。
そういうのが分かってる奴しか相手にしないからお前は早く氏ね。
773nobodyさん:02/10/22 05:14 ID:xIeaXQaj
>>760じゃなくて>>770だった。
あまりアフォだから晒しアゲ

774nobodyさん:02/10/22 07:58 ID:???
>>772
まーまーおちけつ。
故意にせよ抜けてたにせよ、問題を含んでるのは確かなんだから、
より実用的なコードに仕上げた方が建設的ってもんでないかい?
775nobodyさん:02/10/22 10:53 ID:???
とりあえず
<table>
<thead><tr><th>1</th><th>2</th><th>3</th></tr></thead>
<tfoot><tr><th>4</th><th>5</th><th>6</th></tr></tfoot>
<tbody>
<tr><td>7</td><td>8</td><td>9</td></tr>
<tr><td>A</td><td>B</td><td>C</td></tr>
<tr><td>D</td><td>E</td><td>F</td></tr>
</tbody>
</table>
の表示は
1 2 3
7 8 9
A B C
D E F
4 5 6
になるのでよろしく
776nobodyさん:02/10/22 11:51 ID:???
糞ソース晒しあげ

while(<>) {
chomp;
$flg = 0;
$col = 0;
$line = $_;
$line =~ s/(<\/*thead>|<\/*tfoot>)//gi;
$line =~ s|</*tr.*?>||gi;
for $i (0 .. $#row_max) {
undef $row_data[$i] if $. > $row_max[$i];
}
while($line =~ /<(td|th)/) {
$flg = 1;
$col++;
$line = "$'$row_data[$col]$&$`";
if ($line =~ s|<t[dh][^<]+?rowspan.+?(\d+).+?>(.*?)</t[dh]>|"\",\"" . $2 . " (row: " . $1 . ")"|ei) {
$row_data[$col] = "<td>$2 (row: $1)</td>";
$row_max[$col] = $. + $1;
} elsif ($line =~ s|<t[dh][^<]+?colspan.+?(\d+).+?>(.*?)</t[dh]>|("\",\"" . $2 . " (cols: " . $1 . ")") x $1|ei) {
1;
} else {
$line =~ s|<t[dh][^<]*?>(.*?)</t[dh]>|","$1|i;
}
}
print "$line\",\"\n" if $flg == 1;
}
777nobodyさん:02/10/22 12:04 ID:???
糞ソースのコピペはいいからまともなのを貼れ
778nobodyさん:02/10/22 13:28 ID:???
>>775
やっぱり、CSVにはスペース区切りしかないと思ってたのか。
教えといてやる。スペース区切り、タブ区切り、コンマ区切り、K3形式...
おまえみたいなうすまぬけな変換だと
<tr><td>おまえは馬鹿 糞馬鹿</td><td> お前はアフォ 大アフォ</td></tr>
<tr><td>おいらはK3</td><td>他にどんな形式あるか知ってるか? 何も知らなきゃ黙ってろ</td></tr>
は、
おまえは馬鹿 糞馬鹿 お前はアフォ 大アフォ
おいらはK3他にどんな形式あるか知ってるか? 何も知らなきゃ黙ってろ
こんなんなっちゃって、桁が合わなくなって使いみちないよ。
おまえの単純なデータを漏れのすばらーしスクリプトで変換するとこうなる。
","1","2","3","
","4","5","6","
","7","8","9","
","A","B","C","
","D","E","F","
どこにいちゃもん付けたいんだ。

779nobodyさん:02/10/22 13:55 ID:???
全員落ち着け。

>>778
775は一例でスペース区切り上げただけかもしらんだろ。

そもそもnobodyばっかで訳わかんねぇよ。
議論したいならトリップつけるか、自分が書き込みした最初の記事の番号ぐらい名乗れよ。

>>763 なんかtableとかCSVとかと何も関係なく質問しただけかもしれんのに、HTML-lintとか
ワケワカな答えされてるし。

傍から見てウザ過ぎ。

>>763
$_ =~s/\Q/\E//g;
って\Qと\EでくくればOK。
780754=778:02/10/22 14:13 ID:???
>>779
あんたは喧嘩両成敗みたいなことやってるが、明らかに
悪いやつは、何の欠陥を指摘もできないで、漏れのスクリ
けち付けた>>757>>775
>>776は、すばーらしスクリをさらしてくれてありがd。
>>754はすばらーし」、だけでよかった。>>776も考えて
みりゃ、ネットのくずだ。早く逝け。


781nobodyさん:02/10/22 14:24 ID:???
>>763 へのフォローは無しか。
そうやって熱くなって他の人間にまで迷惑を掛ける。
いくらお前から見て>>757>>775が悪でも、傍から見たら一括りにしてウザイんだよ。

そこんトコ分かってくれ。
782754=778:02/10/22 14:26 ID:X4lK8otn
>>775は、糞DOSでやってるんじゃないか。
漏れは自宅のLINUXでやってた。ほんで、>>778は、会社の
Solarisでやった。ちょっと気になって、winでやったら、
こうなった。
","1","2","3
","4","5","6
","7","8","9
","A","B","C
","D","E","F
つまり、\x0d\x0aの改行コードがchompでは1個しか取れなくて、
print "$line\",\"\n" if $flg == 1;
で後ろに付くべき","が消えている。付いてるんだけど表示されない。
もう少し、修行を積むことだな。
783nobodyさん:02/10/22 14:26 ID:???
あ、781=779な。
784754=778:02/10/22 14:44 ID:???
>>781
<table border="1">
<tr><td>おお</td><td>いい</td><td>うう</td><td>ええ</td><td>おお</td></tr>
</table>
は、
┌──┬──┬──┬─────┬─────┐
│おお│いい│うう│ええ</td>│おお</td>│
└──┴──┴──┴─────┴─────┘
になっちゃうけど?
それとも、漏れにhtml2csvじゃなくって、html-lint書けって言うわけ?
まったく別の質問だと思ってたけど?
ちなみに、
$_ =~ s////g;
eucではperlで問題無いけど、sjisでは、/が815Eだから、1バイト文字と重なるね。
81の00と5Eの^に。で、エスケープした方がいい?


785754=778:02/10/22 14:48 ID:???
>>781
そうそう、sjisで日本語やってんなら、jperlにしたら、こいうこと
気にしなくていいんじゃない、って書こうと思ったんだ。
786779:02/10/22 15:53 ID:???
>>784
へぇ、>>763はHTMLの話なんだ。どこからその毒電波でたの?
>>785は同意だけど。

あと君のスクリプトサラッと見てみたけど、colspanとrowspanの2つとも指定されたtdを含む場合
(<td colspan="2" rowspan="2">ほげ</td>ってみたいなの)、問題あるような気がするけど。
787754=778:02/10/22 16:34 ID:???
>>786
それは考えてませんでした。うすうす気づいてたけど。
そういうまともな批判を待ってました。ありがd。
<tr>...</tr>の途中で改行されてるデータと、solspan、rowspanが両方
指定されてるデータに対応したのを作ってみます。比較的すいてるので、
この前は上げたけど、不評なので、上げるかどうか分かりません。
788nobodyさん:02/10/22 17:48 ID:???
" や , はエスケープしなくていいの?
789nobodyさん:02/10/22 17:53 ID:???
・多分正常なHTMLならOK
・多分改行も関係ない
・多分バグある
・多分滅茶苦茶叩かれるw

http://homepage3.nifty.com/~moemoe/table2csv.pl.txt
790nobodyさん:02/10/22 17:54 ID:???
>>788
いいよ。
791nobodyさん:02/10/22 18:30 ID:???
>>789
いいねこれ。もらったぜサンキュー!
792789:02/10/23 01:50 ID:???
イイですか?
自分で書いといて何だがもっとコンパクトに書けそうな気がしたんで
添削キボンなんだが。
ってココまで行くと正規表現の範囲でも無いか。sage
793754=778:02/10/23 02:53 ID:???
ここは正規道場だからね。漏れはほとんどスカラでやって正規表現の
使い方を示した。rowspanだけは難しかったので配列をつかっちゃった。
>>754は、10分か20分で作ったので、さっき改行とcolspan、rowspanに
対応したのを配列なんか使わずに書いたが・・・
Perlのスクリプトを競うのなら「スクリプト改造工房」、「Perl
初心者コーナー」あたりにどうぞ。


794775:02/10/23 03:05 ID:???
ええと、言いたかったのは
4 5 6
が2番目ではなくて最後になるってことで
区切りなんてどうでもよかったんでIEの表示結果を
コピペしただけだったんですが
795754=778:02/10/23 03:29 ID:???
>>794
漏れの実行結果2回も貼り付けたが、なってないじゃん。
お前の実行結果を貼り付けてみる。捏造するのに時間かかるだろ。
796754=778:02/10/23 03:31 ID:???
なるほど、そいうことか。また改造だ。あんがd。
797nobodyさん:02/10/23 10:13 ID:???
激しくがいしゅつだと思うんですけど、メールアドレスの正規表現です。
perlメモを見ましたが初級者にはどう考えても理解できません。
別に理解しなくてもサブルーチンとして貼り付ければいいだけかもしれないんですが、
ある程度何をやっているかわからないとやっぱり気分が悪いです。
で、皆さんが普段利用しているメールアドレスチェック正規表現を教えていただければこれ幸いです。
798ぶっちー:02/10/23 10:36 ID:IaWkOnQn
秀麻呂エディタで「1KG」とか「999KG」の数字3ケタでKG表示している
文字列を「 [999KG] 」のように[]で囲みたくて正規表現を使って置き換え
してるんですがうまくいきません・・・

「オレ様,男,25才,189cm,98KG,12%」
みたいなカンジでカンマで区切ってある行が2000行くらいです。
この中の体重部分だけを[]で囲みたいんデス(泣;
799nobodyさん:02/10/23 11:00 ID:???
>>798
これはどうよ
$a =~ /,(\d*KG),/;
$a =~ s/(\d*KG)/[$1]/ig; 
800789:02/10/23 11:13 ID:???
ちょと修正
・改行関係のバグ
・余計なタグの削除
・その他
スレ違いなのでもうココまで。

>>794
漏れのは多分大丈夫かと。

>>797
$mail =~/^[0-9a-zA-Z_\.-]+@([a-zA-Z0-9][a-zA-Z0-9_-]*\.)+[a-zA-Z]{2,}$/;

>>798
v.3.00以降のみ対応。
・検索:,\f[0-9]*KG\f
・置換:,[\1]
,が付いてるのは名前のトコにも数字KGってくる可能性があるので。
801nobody:02/10/23 11:23 ID:???
>>798
正規表現道場だから、
s/((.*?,){4})(.*?),/$1\[$3\],/;
しかし、普通は、配列を使って、
split/,/;
print "$_[0],$_[1],$_[2],$_[3],[$_[4]],$_[5]";
802ぶっちー:02/10/23 11:34 ID:IaWkOnQn
>>789サマ

神!できました!
どうもありがとうございましたヽ(´∀`)ノ

「タグ付き正規表現」ってヤツですね。
ま、それ知ってても自分でできたとは思えませんが・・・
803ぶっちー:02/10/23 11:41 ID:IaWkOnQn
>>800サマ・・・でございました(汗;

>>798サマ
>>801サマ

PG上でのマッチングじゃなくて秀丸で成形してから
SQLに渡そうと腐心しておりマスタ。いずれにせよ
ソース上で有用な構文、ありがとうございました!
804nobodyさん:02/10/23 12:17 ID:???
なんか自分の考えが正しいと思いこんで他人に押し付けるスレはここですか?
805nobodyたん:02/10/23 12:49 ID:???
Email::Valid 使え。
と思ったり。

変に不完全なチェックするよりマシ。
806nobodyさん:02/10/23 13:28 ID:???
>>804
お前のことか?
807nobodyさん:02/10/23 17:24 ID:???
まあいくらチェックしても[email protected]とか貼られると
どうしようもないわけだが
808nobodyさん:02/10/23 17:57 ID:???
汚染チェックだけしとけばいいって事ですか。
809nobodyさん:02/10/23 18:03 ID:???
>>808
どうせだからそのドメインがホントにあるか&メル鯖はあるか迄見とけ。
810nobodyさん:02/10/23 20:28 ID:???
「文字を含まない」→[^a]*
みたいに出来ますが、

「ある文字列を含まない」ってどうやるんですか?
811nobodyたん:02/10/23 21:06 ID:???
正規表現では表現不可能です。というのが教科書的な回答。
(バックトラックしつつ、) 前から順番にマッチさせていって、最後まで行っ
たら受理されるってのが正規表現だから。
でも、perl の拡張正規表現を使えば出来てしまうのが気持悪いところ。

print "ok\n" if(/^(?!.*xyz)/); # "xyz" が入っていなければ表示される。

先頭の後ろに「任意の個数の文字に "xyz" が続く文字列」が来ないものにマッ
チ。= "xyz" を含まない文字列にマッチ。
812nobodyさん:02/10/24 00:07 ID:???
つーかさ

print "ねーよ" if ($str !~/xyz/);

とか

print "ねーよ" unless ($str =~/xyz/);

じゃ問題あんの?
813nobodyたん:02/10/24 00:19 ID:???
無いよ。
もちろん、普通はそういうコード書く。
814りり:02/10/24 10:25 ID:iH2BcaJh
下のようなフォーマットの日付データを年・月・日に分解するには
どうすればよいですか?

2002.9.1
2002.10.1
2002.11.31

また、与えられた文字列が日付のフォーマットではない場合のチェックは
どうすればいいですか?
教えてください。
815nobodyさん:02/10/24 11:39 ID:???
# 2002.09.01はNG、日付の妥当性もある程度チェック
die "日付じゃねーぞ" unless ($date =~/^(\d{,4})\.(1[0-2]|[1-9])\.(3[0-1]|[12][0-9]|[1-9])$/);
$year = $1; $month = $2; $day = $3;

# 2002.09.01もOK、日付の妥当性もある程度チェック
die "日付じゃねーぞ" unless ($date =~/^(\d{,4})\.(1[0-2]|0?[1-9])\.(3[0-1]|[0-2]?[0-9])$/);
$year = $1; $month = $2; $day = $3;

# うるう年とかあるし後でチェックするから取りあえず数字よこせ
die "日付じゃねーぞ" unless ($date =~/^(\d+)\.(\d+)\.(\d+)$/);
$year = $1; $month = $2; $day = $3;
816nobodyさん:02/10/24 18:21 ID:???
splitした方が速そうだ…
817nobodyさん:02/10/24 20:29 ID:???
ちょっとだけ、おじゃましまーす。

どーでもいいと言わないで下さいね。

=~
ってすごく打ちやすいですよね!
!~
ってメチャ打ちにくいですよね?

皆さん、
!~
をあまり打たないようにコーディングを工夫した方が、
指疲れなくて体に健康ですね。

失礼しましたー
818nobodyたん:02/10/25 02:51 ID:???
私は
if(not $hoge =~ /REGEX/) { ... }
if(not $hoge = 123) { ... }
if(not $hoge eq "hage") { ... }
としている。

まぁ、とりあえず好きなように書けってことで。
819nobodyさん:02/10/25 09:06 ID:???
>>817
それは正規表現じゃないのでPerlスレでやってくれ。
820nobodyさん:02/10/25 12:20 ID:???
>>818
わざわざ

if(not $hoge = 123) { ... }

と書く理由がわからん。以下のように書きなさい。

if(0){ ... }
821声域表現:02/10/25 13:13 ID:fEObcI9/
ちょいと質問。
ログファイルをlog.txtで保存してあります。
中身はこんな感じです。

番号,住所,電話,名前

で、フォームに番号を入力させて送信。
次のページで名前が出てくるって仕様です。

正規表現を用いてlog.txtの番号と同じ行にある名前を持ってきて表示させるには
どうしたらいいのでしょうか?
糞素人丸出しでスマソ、前後に上司でテンパーイ
822nobodyさん:02/10/25 13:53 ID:???
$bango = $in{"bango"};
print $2 if /$bango,{.+*,){2}(.+)/;
とか。
823nobodyさん:02/10/25 13:55 ID:???
うっ、/^$bango,{.+*,){2}(.+)/;だった。
824nobodyさん:02/10/25 13:55 ID:???
うっ、/$bango,{.*,){2}(.+)/;だった。
825nobodyさん:02/10/25 13:59 ID:???
うっ、/^$bango,{.*?,){2}(.+)/;だった。
# 前のレスと同じバイトだと書き込めないのか。2重書きこですかだって。
8263:02/10/25 15:34 ID:???
2002.10.19(土)10-15h  2002仙台市下水道フェア  (雨天決行)

稲垣達也ライブ 「水の音、風の音、光の音」(11;55〜 14:15〜)

場所:勾当台公園 連絡先:仙台市下水道局022-214-8813

2002.10.19(土) 大沢農学校ケナフ学科 (4) 作品づくり(さをり織 など)

場所:大沢市民センター  連絡先:大沢市民センター

2002.10.19(土)サイカチネイチャークラブ観察会 

場所:国立南蔵王青少年野営場 連絡先:サイカチネイチャークラブ

8273:02/10/25 15:36 ID:???
3です。



2002.10.19(土)10-15h  2002仙台市下水道フェア  (雨天決行)
稲垣達也ライブ 「水の音、風の音、光の音」(11;55〜 14:15〜)
場所:勾当台公園 連絡先:仙台市下水道局022-214-8813

2002.10.19(土) 大沢農学校ケナフ学科 (4) 作品づくり(さをり織 など)
場所:大沢市民センター  連絡先:大沢市民センター

2002.10.19(土)サイカチネイチャークラブ観察会 
場所:国立南蔵王青少年野営場 連絡先:サイカチネイチャークラブ

のようにするにはどうすればいいでしょうか?

正規表現で、
2002.10.19
などの日付にマッチさせるのはわかるのですが、複数行にわたる処理って難しいですね。

828nobodyさん:02/10/25 15:55 ID:???
レコード区切りを除いて空行を削除したいってこと?
s/\n\n(?!\d+\.\d+\.\d+)/\n/gs;
829nobodyさん:02/10/25 16:12 ID:???
>>826 - >>827
何やりたいか、はっきり書け、ヴォケが
830声域表現:02/10/25 16:15 ID:fEObcI9/
レスありがとうございます。
具体的に書きます。

log.txtの中身はこんな感じです。
0001  東京  国語  【山田】
0002  千葉  数学  【佐藤】
0003  埼玉  物理  【金子】

番号、住所、科目、名前が入っています。
仕様は番号を打ち込むとその行にある名前が返ってきます。
例えば0001と番号を打ち込み送信すると次のページで
「山田」と出てくるのです。

自分がイメージしている方法ではlog.txtに名前を書き込むときに
【】の括弧で挟んで名前を書き込み、呼び出してくるときに
「"番号(0001)"の列の【】(【山田】)で囲まれた部分を持って来い」
と言う、命令をしたいのです。
こうする事により”名前”がどこにあっても番号と同じ列の【】でくくられた中を
参照するので楽だと思ったのです、感覚的にですが。
これって正規表現で可能なんですか?
831nobodyさん:02/10/25 16:21 ID:???
わざわざ難しくしてどうするんだ阿呆が
832声域表現:02/10/25 16:24 ID:fEObcI9/
では【】を使わないでやるにはどうすればいいのでしょうか?
名前は行の一番最後にあると仮定すると。
833nobodyさん:02/10/25 16:50 ID:???
>>822-825は見たのか?
そもそも>>829は貴様へのレスじゃないぞ間抜け
834声域表現:02/10/25 17:05 ID:fEObcI9/
>>833
>>829が自分へのレスじゃないことぐらいわかります。
その前に貴方は一体なんなのですか?
単に煽りの気がします。
835nobodyさん:02/10/25 18:00 ID:???
836 ◆ZD/EuPncnQ :02/10/25 18:02 ID:???

1 東京 国語 山田
2 千葉 数学 佐藤
3 埼玉 物理 金子


open(FILE,"./log.txt");
@hoge=<FILE>;
close FILE;

foreach (@hoge){
@temp=split(/\s/,"$_");
($hage,$hige)=("$temp[0]","$temp[3]");
$word{$hage}="$hige";
}

print "number :";
chomp($a=<stdin>);
print "$word{$a}\n";
837声域表現:02/10/25 18:12 ID:fEObcI9/
>>836
ありがとうございます。
これを元にがんばってみたいと思います。
838nobodyさん:02/10/25 21:17 ID:I2JNYDvh
おとなの玩具激安販売!
なんとピンクローター300円から♪
マニアック商品などその他いろいろあります!
http://www.king-one.com
839827 :02/10/25 22:48 ID:???
>>829
ああ、やりたいことが確かに判りませんね。
迂闊でした。


改めて、質問いたします。

レコード区切りとなるものが存在せず、
2002.10.19
などの日付にマッチさせ、その前の行は空白を残して、
それ以外の空白を消すということです。

つまり、
\n\n\d\d\d\d\.\d+\.\d+.*
のようなものが区切りのキーになると思います。



840nobodyさん:02/10/26 08:59 ID:???
だから>>828に書いたんだが。
直後に書かれた答えを無視して再質問するのがはやってますか?
841Weasel:02/10/26 18:30 ID:lT7ooPWd
Apacheのログ(Combined)を正規表現しようとして
いるのですが、やり方がわかりません。

> 127.0.0.1 - - [10/Oct/2000:13:55:36 -0700]
> "GET /apache_pb.gif HTTP/1.0" 200 2326
> "http://www.example.com/start.html" "Mozilla/4.08 [en] (Win98; I ;Nav)"

というログフォーマットを
・IPアドレス
・日付
・時間
・ファイル
・処理コード
・バイト数
・参照元
・エージェント

でCSVにしたいのですが・・・

だれか教えてください。
842nobodyさん:02/10/26 18:59 ID:???
CSVって何か知ってる?
843nobodyさん:02/10/26 19:54 ID:lT7ooPWd
>842

CSVってカンマで区切ったフォーマットのことですよね。
Apacheのログは基本的にスペース区切りなのですが、
単にスペースをカンマ(,)に置き換えると、GET /index.html
の中のスペースが区切られたり、いらない「”」が入ったり、
と困っているわけです。また、日付と時間を別のフィールド
にしたいので、正規表現を利用してきちんと指定したいのです。

今は
 1 行を読み込む
 2 - - [ を削除
 3 日付の「2000:」を「2002,」に変換する
 4 -9000] を削除
 5 「"GET 」を削除
 6 ダブルクォーテーションを削除
した上でスペースをカンマに変えてCSVにしています。

これを世紀表現を利用して、もっとスマートにしたいのです。

よろしくお願いいたします。
 
844nobodyたん:02/10/26 20:39 ID:???
my($remote, $ident, $user, $datetime, $req, $status, $size, $referer, $ua)
= m{(\S*) \s+ # remote
(\S*) \s+ # ident
(\S*) \s+ # user
\[(.*?)\] \s+ # datetime
"(.*?)" \s+ # request line
(\S*) \s+ # status
(\S*) \s+ # size
"(.*?)" \s+ # referer
"(.*?)" # user agent
}x;

とでもした後、適当に変形すれば良いだろ。
845Weasel:02/10/26 20:47 ID:lT7ooPWd
>>844

ありがとうございます。早速試してみます。
846nobodyさん:02/10/26 22:48 ID:???
以前から、ずーと欲しいツールで、
正規表現だけで解決できるかどうかわかりませんが、
あるディレクトリにcsvファイルが
data01.csv
data02.csv
……
data10.csv
のように存在しています。
これを
perlなどで処理したい場合、これらのデータをファイル読み取りのところで、
配列の配列の配列やハッシュのハッシュのハッシュ
という3次元データー構造に変換しなければ、その後のプログラミング
が煩雑になりそうで、いままで、ずーと避けてきました。

厨な私は、普段はこれをエクセルで処理してるんですが、
いっそのこと正規表現で処理してしまえないでしょうか?

なにかアドバイスありますか?
847nobodyさん:02/10/27 00:42 ID:???
>>846
で、どう処理したいの? 肝心な部分を書いてくれないとなんとも言えないよ
848Weasel:02/10/27 00:52 ID:5TH4jHN5
>>846

 1 ディレクトリ下のファイル名を<*>で取得
 2 ファイルを開く
 3 tempファイルにファイル名と一緒に一行ずつ書き出す
 4 ファイルの数だけ2と3を繰り返す
 5 まとまったtempファイルを処理する

てな感じではどうでしょうか? とは言うもののdata01〜10.csvの
違いがわからないのですが?
849Weasel:02/10/27 01:07 ID:5TH4jHN5
>>844

すみません。これPerlでしょうか?
 m{ ... }x;
という書式の意味がわからないです。読み込んだ
ログファイルはどの変数に格納すればよろしいの
でしょうか?

大変あつかましくて恐縮ですが、何卒ご教授お願い
します。

850nobodyさん:02/10/27 02:25 ID:???
やりたいこと→perl式
は質問してもしかたないけど
perl式→説明
は「おしえて君」
ですよ。自分で調べられるでしょう。やりたいこと→perl式
は質問していいけど、
perl式→説明
は自分で調べられるでしょう。
851nobodyさん:02/10/27 02:45 ID:5TH4jHN5
>>850

失礼しました。会社にラクダ本があるので、
月曜日に調べてみます。
852nobodyさん:02/10/27 03:15 ID:???
844じゃないけど。
 /xモディファイアは、正規表現の中にスペースとかコメントが
入るのを許すもの。m{...}は、デリミタを(デフォルトの"/pat/"
だと"/"をエスケープしなきゃいけなくなるので)"{pat}"にするよ、
とういうことでつな。

>読み込んだログファイルはどの変数に格納すればよろしいの
>でしょうか?
 普通に読み込めば?
open LOG, "hoge.log";
open OUT, ">fuga.csv";
while(<LOG>){
     #844さんのコード
     #その他必要な処理
     
     print OUT "$remote, $ident, $user, ・・・\n";
}
close OUT;
close LOG;
 みたいな感じで。
853nobodyさん:02/10/27 08:54 ID:???
>>73
がなぜ
ドラゴンクエスト?
854Weasel:02/10/28 02:01 ID:pNQg1CBu
>844
>852

情報ありがとうございます。これってPerlの省略形だった
のですね。


1 変数の記述省略
  while (<LOG>) {
   print;
  }
  
  という指定は
  
  while ($xx = <IN>) {
   print $xx;
  }
  
  という指定と同じことなのですね。私は常に変数を記述していた
  (もっというと、配列に読み込んでforeachを使用していた)ので
  わからなかったです。


2 m{ ... }x; について
  これが正規表現だということに気づきませんでした。
  私はいつも
   $ =~ s#abc#def#x
  という形で利用していたので、上記のような指定ができることを
  知りませんでした。

もっと勉強します。本当にありがとうございました。
855nobodyさん:02/10/28 09:19 ID:???
すいません。初心者なんですが、
正規表現にて日本語以外、ってどのように指定したらいいんでしょうか。
英字、数字、空白文字はOKで、日本語のみだめ。
jcodeとかつかわないとムリなんでしょうか?
856nobodyさん:02/10/28 13:02 ID:???
[a-zA-Z0-9 ]
857827:02/10/28 15:19 ID:???
828さんどうもありがとうございました。

返事が遅くなりました。
858nobodyさん:02/11/02 05:32 ID:I/qwWelh
/aaa::bbb
/bbb
/aaa::bbb/ddd
/bbb/ccc::ddd

つまり
/aaa::bbb
/bbb
等の繰り返し
# aaa:: は省略可能です。

などにマッチさせようとしてるんですけど駄目っす。
助けてください。↓今のとこ、こんな感じ

(/([^:/]+::)?[^:/]+)+
かなり的外れっぽいですが(汗
859nobodyさん:02/11/02 13:39 ID:???
/^(?:\/(?:[a-z]+::)?[a-z]+)+$/;
860859:02/11/02 14:31 ID:???
●/aaa::bbb::ccc/ddd のパターンを許すなら

/^(?:\/(?:[a-z]+::)*[a-z]+)+$/;

● / と : 以外の文字が[a-zA-Z_]なら
/^(?:\/(?:\w+::)*\w+)+$/;
861858:02/11/02 16:22 ID:I/qwWelh
さっそくありがとうございます >859

目的としているのは、>859見たいな奴ですが、
Invalid regular expressionとか出てしまいました(;_;
regex.cで(GREP?SED相当?)最終的にできればいいんですが。

どうも
?:
のとこでコケテます。

ちなみに、
いいい::あああ/ううう
とかも可能にしたかったりします。

あああ、いいい、ううう
に入れられる文字は:と/以外といった感じで。
862nobodyさん:02/11/02 16:45 ID:ywtiXWST
()で囲まれた文字列だけ

str1,str2,str3(str4,str5,str6)str7,str8,str9 なら str4,str5,str6 だけ

"," → "," と変換したいのですが、
どういう文にすればいいですか?

s/\(([^\)]+),([^\)]+)\)/\($1,$2\)/g;

を何回か繰り返すことで何とか済ました(本当か?)のですが、
まともなやり方を知りたくなりまして。
863858:02/11/02 16:53 ID:???
(?: regexp)
は、部分正規表現のグルーピングなんですね。(レポートなし。
ということはこれは外してみて、

/^(\/([a-z]+::)?[a-z]+)+$/;
で、やってみたら通ったけどマッチせずでした。

薄識なんで、\/と最後の/の意味がわからないっす。
864nobodyさん:02/11/02 16:58 ID:???
>>863
Perlの正規表現ではそう書く
865nobodyさん:02/11/02 17:01 ID:???
>>862

1 while s/(\([^)]+),/$1,/g;
866865:02/11/02 17:03 ID:???
こっちがいいな
1 while s/(\([^),]*),/$1,/g;
867nobodyさん:02/11/02 17:40 ID:???
正規表現で、入れ子ってどうやって扱えばよいのでしょうか?

[aa]
[aa[]
[aa[]]
から
[aa]
だけ許すみたいな。

単純に
\[[^\[\]]+\]
でやったら
[aa]にはかからず、[aaa[]]に引っかかっちゃいました。
868862:02/11/02 20:50 ID:???
>>865
めちゃくちゃシンプルですね。しかもレス早いし。
かなり助かりましたです。
どうもありがとうございました。
869 ◆hMJAPH9PWA :02/11/02 21:14 ID:???
>>867
Perlで試したら1だけOK、他はマッチしなかったけど?
870perl初心者:02/11/02 22:24 ID:???
ほんまや・・・

#! /usr/bin/perl

@set= ("[aa]","[aa[]","[aa[]]");

foreach $value (@set){
if($value =~ /\[[^\[\]]+\]$/ ){
print "$value\n";
}
else{
print "not match\n";
}
}

PostgresのPOSIX正規表現で試してて、まぁ実際はregex.cで使う
予定だったので又実際に試してみましす。
871870:02/11/03 21:50 ID:???
#include <string.h>
#include <regex.h>

int main(int argc,char *argv[])
{

int i;
regex_t preg;
char *pattern = "^(\\[[^\\[\\]]+\\])+$";
puts(pattern);

/* Complile RE Pattern */
i=regcomp(&preg,pattern,REG_EXTENDED|REG_NEWLINE|REG_NOSUB);
if (i != 0){
puts("error\n");
return 1;
}

puts(argv[1]);
/* Evolute RE */
i = regexec(&preg,argv[1],(size_t) 0, NULL,0);
regfree(&preg);
if(i != 0 )
puts("no match\n");
else
puts("match\n");

return 0;
}
872870:02/11/03 21:50 ID:???
(続き)
うう、駄目っす(;_;

echo "[aaa]" | egrep "^(\[[^[]+\])+$"

ちなみに、
char *pattern = "^(\\[[^[]+\\])+$";
だと、
○[aaa]
○[aaa]]
×[aaa[]]
まで通る

ので、たぶん、[と]のエスケープが駄目のようなんですが。
perlのREって独自の実装だから通るって話ですか?
Rubyとかはgnu regex使ってると思うのでたぶん通らない(?

ここより、Cスレの方が適切かもしれんけどよろしこ!
873870:02/11/03 22:12 ID:RYsGgBBR
うわ。WebProg板なのに、埋もれとる...
age!
874nobodyさん:02/11/04 00:20 ID:5X7nKz+P
"foo bar" =~ /f/ # => <<f>>oo bar
"foo bar" =~ /f*/ # => <<f>>oo bar
"foo bar" =~ /o/ # => f<<o>>o bar
"foo bar" =~ /o*/ # => <<>>foo bar

ruby でどこにマッチするかを表示させてみたのですが、
/o*/が先頭の空文字とマッチするのがどうも分かりません。なぜでしょうか。
f<<oo>> bar とマッチすると思っていたのですが。
875874:02/11/04 00:25 ID:5X7nKz+P
あれ、最左最長だからこれでいいんだっけ…?
876870:02/11/04 06:13 ID:???
このサイト参考に
http://www.kt.rim.or.jp/~kbk/regex/regex.html

(\\[([^][])+\\])+$

でやったらでけますた
877nobody:02/11/04 06:52 ID:???
Perlスレを荒らしまくっているruby基地外の好きなrubyなんかの
質問には答えません。
878nobodyさん:02/11/05 13:21 ID:???
布谷知夫 (1998) 環境教育の場としての里山. ランドスケープ研究 61: 296-298.
北尾邦伸 (1998) 風土・文化の伝承の場としての里山. ランドスケープ研究 61: 287-289.
横張真 (2000) 国内外の農政における環境保全の位置づけ.ランドスケープ研究, 63(3), 182-185.
加藤和弘・一之瀬友博・大久保悟 (1997) 都市近郊におけるコナラ林の組成および構造について.ランドスケープ研究, 60(5), 539-542.

のような参考文献一覧があり、
「ランドスケープ研究, 60(5)」の「60(5)」という数字で並び替えたいんですが、
やり方判る方いらっしゃいますか?
ランドスケープ研究の次は、スペースの時と、カンマ(, )の時とが、混在しています。

なお、もとデータはhttp://homepage.mac.com/hitou/satoyama/bunken.htmlから「ランドスケープ研究」というキーワードでgrepしたものです。
879878:02/11/05 14:42 ID:???
訂正。
-----
もとデーターは
http://www.ss.iij4u.or.jp/~osamu-s/bibliography.htm

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

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

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

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

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

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


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

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


890nobodyさん:02/11/07 10:52 ID: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>
ってしたいんですけどスマートな解決法ありませんでしょうか?
891nobodyさん:02/11/07 12:02 ID:???
>>890
#hello/nest/#/hello/
892nobodyさん:02/11/07 12:08 ID:???
>>890
/だと閉じタグの/と紛らわしいので他のにしてください。
893nobodyさん:02/11/07 15:20 ID:???
perlの正規表現で
29から44までの数字ってどう表しますか?

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


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

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

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

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

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

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

正規表現のリファレンスページでは見あたらなかったので、
"\\"というくくり方(捉え方)がそもそも違うのかもしれませんが、
わたしの聞きたいところはご理解いただけないでしょうか。
902nobodyさん:02/11/08 01:21 ID:???
"\\"は¥を表す
903nobodyさん:02/11/08 02:00 ID:???
わたしの未熟な知識だと、
"\."は"."そのものを表し、"\\."なら"\"と任意のひと文字にマッチする…。
ということになるのですが、>>897の場合は違いますよね…?
どう違うのでしょうか。
904nobodyさん:02/11/08 02:12 ID: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 吐かないだけマシって考えてください。
905 :02/11/08 02:52 ID:???
"\""="
"\\"=\
"\\."=\.
?
906nobodyさん:02/11/08 03:00 ID:1u/BJa8n
***@2ch.net
907897:02/11/08 03:57 ID:???
えと、905さんの真意は不明ですが、
わたしは905さんとほぼ同じように考えています。
ただし、"\\."だと、"\."という文字列ではなくて、
文字列としての"\X"とか、"\0"とかにマッチする、
つまり、"."は正規表現として扱われるのではないか、と。
そうだとすると、メールアドレスに"\"なんて含まないじゃないか、
なんて思ってしまうわけです。

906さんもヒントなのでしょうか?
***@2ch.netだと、"*"がマッチしないので、ダメですよね。
("\"のときも"\\"のときも)
[email protected]にしてみましたが、当然マッチします。
("\"のときも"\\"のときも)
908nobodyさん:02/11/08 04:03 ID:???
"<a href=\"index.html\">" → <a href="index.html">
"\\" → /\/
"\\." → /\./
?
909nobodyさん:02/11/08 08:20 ID:???
>>905, >>906, >>908
日本語不自由ですか?
910nobodyさん:02/11/08 08:46 ID:???
>>909
FUCK OFF.
911>>897:02/11/08 17:02 ID: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」などにもマッチするのでは?
912897:02/11/08 19:47 ID: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 = '[email protected]';
ならマッチします。
913897:02/11/08 19:52 ID:???
>>911さんがおっしゃりたかったのは、
正規表現として読まれる前の正規表現というか、
"\."をもう一度正規表現として読むと、
正規表現としての"."になってしまう、という意味ですよね。
でも、実際はそういう、二段階で読まれる構成にはなっていないようです。

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

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

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

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

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

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

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

916nobodyさん:02/11/08 21:49 ID:???
>>915
はげしく外出。>>789,>>800
917nobodyさん:02/11/08 21:50 ID:???
>>914
httpなんていう全角のurlがあるとは思われんので
レス不可能。
918914:02/11/08 21:53 ID:???
ごめん自己解決した。
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);

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

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

>>912 そうです。

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

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

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

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

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

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

1
1

つうことじゃないの?
何で何をどうやってるのかわからんけど。
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;