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

正規表現道場@2ch

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

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

もっとイイ(・∀・) リンクは>>2-10さん辺りが書いてくれるカモ・・・・
0557nobodyさん02/08/29 16:48ID:???
あのぅ
すいませんが…
正規表現で困っています
『困ったヤシ』を削除したいんですけど
s/『困ったヤシ』*?$//g;
では無理っぽいですた
0558名無しさん@Meadow02/08/29 17:12ID:???
>>556
[from|FROM] [^"]
0559名無しさん@Meadow02/08/29 17:19ID:r4ScsmNZ
>>557
s/『困ったヤシ』//g;
*?$って書くと、行末の『困ったヤシ』にしか対応線。
0560nobodyさん02/08/29 17:51ID:???
>>558
(from|FROM)[^"] デショ
0561nobodyさん02/08/29 17:53ID:???
>>560
( ´,_ゝ`) プッ   
0562困ったヤシ02/08/29 17:56ID:???
キタ━━━━━(゚∀゚)━━━━━!!!!!
(from |FROM )[^"]
で逝きますた
0563nobodyさん02/08/29 18:13ID:???
>>561
( ´,_ゝ`) プッ
056456002/08/29 18:21ID:???
その
( ´,_ゝ`) プッ
てやつやめてくれませんか。お願いします。
間違いがあるなら指摘しテク浅い。
0565nobodyさん02/08/29 18:24ID:???
( ´,_ゝ`) プッ  だってさぁ、半角スペースがどこにも入ってないから
0566nobodyさん02/08/29 18:31ID:???
( ´,_ゝ`) フーン
0567困ったヤシ02/08/29 18:32ID:???
やめなよう
揉めごとはぁ。
(´Д`)ハァハァ
0568困ったヤシ02/08/29 18:45ID:???
(´Д`)ハァハァ
0569nobodyさん02/08/29 18:47ID:???
まぁ、質問者当人が喜んでいるので万事解決って事で。
0570いらすま02/08/30 21:33ID:kfTl+oQS
性器表現

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

perldoc -q url
0575nobodyさん02/08/31 07:19ID:OvxGQyUv
http://europa.ath.cx/content/computers/docs/o'reilly/book/
0576nobodyさん02/09/01 16:35ID:qOjuyzjx
>>572
http://openlab.ring.gr.jp/k16/htmllint/explain.html#excluded-url
0577名無しさん@Meadow02/09/04 03:47ID:zyxWHEDD
jperlも[^2バイト文字]の場合、1バイト単位で処理するんですね。
sjisでは、全角記号は、ほとんど(全部?)\x81から始まっているので、
/[^※]+/とすると全角記号が入っている場合は合致しないんです。
この理解で合っていますか。
0578 ◆dKHETt0c 02/09/04 13:06ID:???
てすと
0579nobodyたん02/09/04 13:17ID:???
>>572
ftp://ftp.iij.ad.jp/pub/rfc/rfc2396.txt
http://www.japu.org/tmp/http.c
0580nobodyさん02/09/05 01:39ID:???
2ちゃんねるのIDはこれでいいですか?
^[A-Za-z0-9/]{8}$

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

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

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

ではダメみたいです。

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

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

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

ここまで行きました。

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

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

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

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

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

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

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

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

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

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

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

#! /usr/local/bin/perl

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

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

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

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

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

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

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

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

0601nobodyさん02/09/14 16:49ID:???
^ はいらないんじゃない?
0602名無しさん@Meadow02/09/14 21:28ID:???
>>601
$ perl -e '$var="abc"; if ($var=~/b/){print "601 is an aho!\n";}'
601 is an aho!
0603名無しさん@Meadow02/09/14 21:30ID:???
$ perl -e '$var="abc"; if ($var=~/^b/){print "601 is an aho!\n";} else {print "
601 is God!\n";}'
601 is God!
0604nobodyさん02/09/15 00:00ID:???
>>602 がah(略
0605名無しさん@Meadow02/09/15 07:34ID:???
>>602, >>603はGod
>>604はdoah(略
0606nobodyさん02/09/16 22:01ID: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 "");
0607nobodyさん02/09/16 22:10ID:???
${1}1$2
0608nobodyさん02/09/16 22:16ID:???
おお、なるほど。そんな書き方でしたか。やってみます。
どうもありがとうございます。
0609nobodyさん02/09/17 02:24ID:QLf2zkHZ
3文字の数字のみにマッチをしているのですが、できません。

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

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

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

12 67 at hy s4

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

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

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

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

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

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

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

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

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)
0630名無しさん@Meadow02/09/23 10:25ID:???
>>629
べんきょになりましたm(__)m
0631nobodyさん02/09/23 14:48ID:???
JRE32v1.17で

std::string
string
std::vector
vector

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

(std::)?string|vector

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













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

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

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

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

s/([.,]|\xa1[\xa2\xa3\xd6\xd7])|(\216[\241-\337]|\217?[\241-\376].|.|\n)/$1?' ':$2/ge;
0644nobodyさん02/09/25 01:05ID:???
この辺嫁。
http://www.din.or.jp/~ohzaki/perl.htm#JP_Match
0645名無しさん@お腹いっぱい。02/09/25 01:50ID:???

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