正規表現道場@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さん辺りが書いてくれるカモ・・・・
0593nobodyさん
02/09/05 14:36ID:87M5TYG6上の例だとマッチするが…
下記に確認に使ったソースを載せとく。
他に何か言い忘れてる事ある?
マッチさせたくてさせられなかった文字列はどんな?
#! /usr/local/bin/perl
print "Content-type: text/plain\n\n";
$hoge = '>あああ >おおお;';
$hoge =~ s|(>(?![^;]+>)[^;]+);|<font color=blue>$1</font>|g;
print "$hoge";
0594581
02/09/05 14:40ID:qJJ4ywe1すいません
バッチリでした。
ちょっとぜんぜん関係ないところでミスってました。
本当に申し訳ありませんが、もうひとつだけ条件追加させてください。
>と;の間で改行したらマッチしないようにしたいです。
この場合の改行は<br>なので改行コードではないです。
だから簡単だと思ったのですが、「<br>」という文字列を丸ごと指定する方法が
わかりません。
こまった。
0595nobodyさん
02/09/05 14:53ID:87M5TYG6$hoge =~ s%(>(?![^;]*(?:>|<br>))[^;]*);%<font color=blue>$1</font>%ig;
どこに<br>が入ってるかわかんないので+を*に変えといた。
ので、>;でもマッチしてしまうが。
0596581
02/09/05 15:11ID:qJJ4ywe1>;でマッチするのはぜんぜんOKです。
ありがとうございました!
0597nobodyさん
02/09/05 16:03ID:???>の部分にマッチしてしまう罠。
0599nobodyさん
02/09/14 03:35ID:ptF5alUdあほ、あへへ、とかにヒットするようにしたいんですが、やり方わかりません。
if ($DB[$key] =~ /^$QUERY{'hd'}.*/) 〜
とかやってみました。ぜんぜんだめです。「{」は「\{」って書くんですか?
やってみたけどだめでした。どやってやったらいいですか。
0600名無しさん@Meadow
02/09/14 08:27ID:???条件をもっと正確に書きましょう
「あほ、あへへ、とか」って?
$DB[$key]が「あ」で始まる任意の文字列にマッチする場合ということなら
if ($DB[$key] =~ /^$QUERY{'hd'}.*/) 〜
これでええです。
エラーをもっと正確に書きましょう
「ぜんぜんだめです。」って?
エラーメッセージを見ればほとんどのことは分かるんです
0601nobodyさん
02/09/14 16:49ID:???0602名無しさん@Meadow
02/09/14 21:28ID:???$ perl -e '$var="abc"; if ($var=~/b/){print "601 is an aho!\n";}'
601 is an aho!
0603名無しさん@Meadow
02/09/14 21:30ID:???601 is God!\n";}'
601 is God!
0605名無しさん@Meadow
02/09/15 07:34ID:???>>604はdoah(略
0606nobodyさん
02/09/16 22:01ID:l9cfV4Lxだめでした。どうやって書けばいいですか。よろしくお願いします。
$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:???0608nobodyさん
02/09/16 22:16ID:???どうもありがとうございます。
0609nobodyさん
02/09/17 02:24ID:QLf2zkHZif($word=~/^[0..9]{3,3}$/){ print"ok";}
\dなど使わないでこの形式で正して下さい。
0610名無しさん@Meadow
02/09/17 02:42ID:???相当の初心者さんですね
[0-9]{3}
0611nobodyさん
02/09/17 03:51ID:QLf2zkHZできた。できた。ありがとうございます。{3,3}でもできた。
0612nobodyさん
02/09/17 08:17ID:???>{3,3}でもできた。
そりゃできるだろうけど、「3文字の数字」を探すときにわざわざ
「3文字以上3文字以下の数字」って書くのはちょっとね。
0613nobodyさん
02/09/17 09:33ID:???0616名無しさん@Meadow
02/09/17 12:33ID:???不合格!!
よく問題を読みましょう.
\dを使わずにやれとある
0617nobodyさん
02/09/17 12:37ID:???0618nobodyさん
02/09/18 11:38ID:???0619nobodyさん
02/09/18 18:06ID:???0620nobodyさん
02/09/22 08:08ID:GGE38Iwz12345 や 67890 や at41n や hyrdf985 や s4r などの文字列を
12 67 at hy s4
のように先頭の2文字だけに変換させるのはどうしたらよいでしょうー。
substr使えやゴルァ といわずに、正規表現でやってみたいのです。
何文字あるのかわからないため、...$ などは使えないし。
s/^..// なんてやると2文字だけ消えてしまうし、、
$_ = '1234567';
/(^..)/;
ってやれば、$_ = $1 でできるかもしれないけど、こんな手間かけるのもアレやし、、
s/先頭の2文字でない文字//;
とかやりたいの。
0621名無しさん@Meadow
02/09/22 08:32ID:t+76B0UPs/(^..).+/$1/
じゃ不満?
0622nobodyさん
02/09/22 08:39ID:GGE38IwzそれでもOKです、ありがとう!!!
でも、対象文字列が2文字でもOKです?
一応、対象となる文字列は「最低2文字はある」ということを前提にしてもよいです。
.+ って0文字でもよい?
0623名無しさん@Meadow
02/09/22 08:43ID:t+76B0UP.+は1文字以上。
0624nobodyさん
02/09/22 08:53ID:GGE38Iwzそうかー、さんきゅー助かった!
迷惑ついでにもうひとつ聞くけど、
substr使うより、正規表現使ったほうが処理早い?
「何文字かの文字列を先頭の2文字だけに変換する」
という処理を数千件行うんだけど、どっちが早い?
数千件程度じゃあんまり変わらんかw
0625名無しさん@Meadow
02/09/22 09:03ID:t+76B0UP死らん。やってみて報告キボンヌ。
$start=time();
while(<>) {
s/(^..).*/$1/; #または、substr($_, 0, 2);
}
$end=time();
print $end-$start, "\n";
0626nobodyさん
02/09/22 09:11ID:GGE38Iwz数千件と言いながら3357件しかないので、
たいして変わんなかったw
期待はずれスマソ
0627名無しさん@Meadow
02/09/22 09:12ID:t+76B0UPs///は$_が変化している。substrはそのまま。
$_にさらに処理を加えるなら、s///にしなきゃだめだけど
最初の2文字出すだけならprint substr...の方が早いっしょ。
0628nobodyさん
02/09/22 09:20ID:GGE38Iwzそかそか、勉強になった、さんくすコ
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名無しさん@Meadow
02/09/23 10:25ID:???べんきょになりましたm(__)m
0631nobodyさん
02/09/23 14:48ID:???std::string
string
std::vector
vector
にヒットする正規表現がわかりません・・・
(std::)?string|vector
だと、std::が付いてないヤツにヒットしないです
0632nobodyさん
02/09/23 14:50ID:???0633631
02/09/23 14:54ID:???そ・・・そんな単純な事なのか・・・
ありがとうございました
0634名無しさん@お腹いっぱい。
02/09/24 23:42ID:???きっと誰かやってると思うんだけど、日本語を含む文字列中の , . など
区切り文字を空白に置換する正規表現を教えてください。
できれば、。「 」なんかもできるといいです。
0636nobodyさん
02/09/25 00:03ID:???0638636
02/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;
とやってみましたが日本語が化ける場合があります。
0640637
02/09/25 00:25ID:???s/[.,]|\xa1[\xa2\xa3\xd6\xd7]/ /g;
0642nobodyさん
02/09/25 00:47ID:???0643637
02/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元に戻す( ~ とか . とかに)という処理を正規表現で行えますか?
0647nobodyさん
02/09/29 19:35ID:???URLデコードで検索しろや。
0648nobodyさん
02/09/29 20:32ID:knautRXm安全にデコードできるパターンだけを元に戻したいんですけどそういう判定を
正規表現でできますか? という質問。
0651nobodyさん
02/09/30 12:56ID:???指定が面倒そうだから一度エンコードしてデコードし直せば?
s/%([a-f\d]{2})/pack("H2",$1)/ieg;
s|([^\w/\.&%?~+=:@#\-])|'%'.unpack("H2",$1)|eg;
0652651
02/09/30 12:58ID:???0653nobodyさん
02/10/01 01:46ID:m9+B5ZACURLを同一性チェックのために正規化したいんです。
>>651
それだと最初はエンコードされてなかった / とか # とかも
エンコードされてしまいまつ…
0656nobodyさん
02/10/01 10:56ID:???デコードされてしまうのでやっぱり困ります。
同一視されては困るからエンコードしてるのに
区別がつかなくなっちゃう。
0657nobodyさん
02/10/01 12:21ID:???だから意味考えろって。
'[' ']'をエンコードさせたくないなら[^〜]の中に
\[\]を加えればいいだけだろ。
/はエンコードしたいなら[^〜]の中の/を外せばいいだろ。
お前の頭にゃ何が詰まってんだ?
エンコードしたくないものを[^〜]の中に並べるだけ。
>>651のはただの一例だろ。実際に何を並べるかくらい自分で考えろ。
0660nobodyさん
02/10/01 12:48ID:???>元に戻す( ~ とか . とかに)という処理を正規表現で行えますか?
>ていうか最初は %2F にエンコードされてた / が
>デコードされてしまうのでやっぱり困ります。
このへんが特にわからないね。
URLで使える文字を戻したいんじゃ無かったのか?
0661nobodyさん
02/10/01 12:59ID:???0662nobodyさん
02/10/01 15:00ID:???最初が「/%2F」なら「//」でも「%2F%2F」でもなくて
「/%2F」のままなるようにしたいんです。文字クラスに
足したり引いたりするだけでそんなこと出来ますか?
「~%7E」は「~~」にしたいです。
そのままにしたい文字(「/」のような)と統一したい文字
「~」のような)を区別する基準は、RFC2396のunreservedに
含まれるか否かです。
たとえば「/%7Ehoge」と「/~hoge」は同じURIだから、
この変換を掛けた後はどちらも同じ文字列にしたいけど、
「a/index.html」と「a%2Findex.html」は違うURIだから
同じになっては困るということです。
0663nobodyさん
02/10/01 15:42ID:???my %reserved = map { unpack('H2',$_) =>1 } qw(; / ? : @ & = + $ ,);
s/%([0-9A-Fa-f][0-9A-Fa-f])/$reserved{lc $1}?"%$1":pack('H2', $1)/eg;
こんなとこか?
0664nobodyさん
02/10/02 03:14ID:???このURL自体がありえないと思う。
0666nobodyさん
02/10/02 12:07ID:???# と %23 が同一視されたらまずいのは明らかだろ。
0667nobodyさん
02/10/06 00:18ID:uZEZ57G8例
12345,67890,12345,67890 → 12345,67890,12345
aaa3,5567,3333333,aser567 −> aaa3,5567,3333333
dser6f,ghhs,,asfa,wfdw,,,,asf -> dser6f,ghhs,,asfa,wfdw,,,
0668nobodyさん
02/10/06 00:21ID:???0670nobodyさん
02/10/06 01:34ID:uZEZ57G86個目の , 以降の文字列を削除する正規表現について。
例
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/;
もっとスマートな書き方ありませんか?
0671nobodyさん
02/10/06 01:49ID:???0672nobodyさん
02/10/06 01:49ID:???s/([^,]*,[^,]*,[^,]*,[^,]*,[^,]*,[^,]*).*/$1/;
0673nobodyさん
02/10/06 02:10ID:???0674nobodyさん
02/10/06 02:12ID:UBZ5BN7Lとか。
0675名無しさん@Meadow
02/10/06 02:15ID:???くそ、さき越された。早く寝ろてめえら。
0677nobodyさん
02/10/06 02:18ID:uZEZ57G80678名無しさん@Meadow
02/10/06 02:35ID:???しかしだな、
$st =~ s/^((.*?,){6}).*/$1/;
の方が普通やね。やっぱ、俺の方が(略
0680名無しさん@Meadow
02/10/06 02:53ID:???む、やっぱ、あんた=>>674?の方が(略
0681nobodyさん
02/10/06 02:57ID:QWnMytEq<%.*%>でオーケーとか軽く考えていたのですが、.は改行文字にはマッチしないのですね。
改行文字も含めてとにかく全部マッチさせるにはどうしたらいいのでしょうか?
#サクラスレではレスが付きませんでした(T_T)
0682nobodyさん
02/10/06 03:16ID:???改行コードに色は付きません。
改行コードの正規表現は、
windows: \r\n, unix: \n, Mac]\r
です。
0683nobodyさん
02/10/06 03:17ID:???0684nobodyさん
02/10/06 03:25ID:???ものに代替文字を当て、そいつに色タグを付けるようにしる。
0685nobodyさん
02/10/06 03:53ID:QWnMytEqごめんなさい、ちょっと書き方が悪かったですね。
<%.*%>と指定しても、<%と%>に挟まれた文字に色がつかないんです。
それで、改行が挟まっているのでマッチしないのか、と思い>>681を書いたのですが……
私、根本的に間違っているのでしょうか?(^^;
0686nobodyさん
02/10/06 04:07ID:???そいじゃ、「改行文字も含めてとにかく全部マッチさせる」じゃなくって
「改行文字を除いた部分にマッチさせる」じゃねーかよ。日本語大丈夫?
<%.*%>の中に改行が入っているかどうかなんて見れば分かるだろ。
それが確かに原因だと確かめられてから質問しろ。改行を挟む文字列を
連結するにはどうすればいいですかってな。
質問の仕方じゃ、どっかでレスが付かなかったのも当然だよ。
0687nobodyさん
02/10/06 04:31ID:???とかいうレベルの話じゃないの
0688nobodyさん
02/10/06 04:34ID:???我はもう寝る
0689nobodyさん
02/10/06 04:35ID:???0690nobodyさん
02/10/13 00:14ID:w3kn3Su/0から始まらない数字だけの文字列
ってどう表現すればいいですか?
※001とか0930とかは駄目ってことです。
0691nobodyさん
02/10/13 01:08ID:???0692690
02/10/13 01:19ID:w3kn3Su/ありがとう!
■ このスレッドは過去ログ倉庫に格納されています