トップページ⇒php
1001コメント313KB

正規表現道場@2ch Part3 s/煽り|荒らし/あぼーん/g

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん03/11/19 21:42ID:Kst3Nn4S
Perlに限らずスクリプト系言語で大活躍の正規表現。
このスレは有用そうな正規表現を紹介したり、どう表現したらいいかわからないときに質問をしたりするためのスレッドです。
質問するときは使用言語や得たい結果をなるべく詳しく書きましょう。

註:& や " を書くときには、&amp " と描いておきましょうね。

Perlメモ
 http://www.din.or.jp/~ohzaki/perl.htm
正規表現メモ
 http://www.kt.rim.or.jp/~kbk/regex/regex.html
Regex::Diagram.pm
 http://www.cc.rim.or.jp/~midorin/mad-p/RegexDiagram.html
正規表現
 http://www.cc.rim.or.jp/~midorin/mad-p/perl/benkyou/PRC2kRegex/
UNIX正規表現入門 目次
 http://www01.u-page.so-net.ne.jp/jc4/hiroyuki/rex_index.html
Regular Expression(Riue ちゃんの正規表現講座) - Index
 http://www.sixnine.net/regexp/

ほとんどは↓のリンク集にまとまっています。
正規表現最新リンク集2002
 http://www2.famille.ne.jp/~akio1998/l_grep.html

過去スレ
正規表現道場@2ch
 http://pc.2ch.net/test/read.cgi/php/996105815/
正規表現道場@2ch Part2
 http://pc2.2ch.net/test/read.cgi/php/1038146241/
0771nobodyさん04/10/13 20:05:36ID:???
前にスペースある"と後ろにセミコロンがある"を除いたすべての"をエスケープするという方法でもいいのですが。
0772nobodyさん04/10/13 20:10:59ID:???
>>771
Perl なら
$text =~ s{\x20"(.*?)";}{ (my $str = $1) =~ s/"/\\"/g; qq|\x20"$str";| }eg;
0773nobodyさん04/10/13 20:14:38ID:???
もしくは
$text =~ s{(?<=\x20")(.*?)(?=";)}{ (my $str = $1) =~ s/"/\\"/g; $str }eg;
0774nobodyさん04/10/13 20:48:20ID:???
772-773
サンクス。とりあえずそれでできましたが、
$text = '$a = "foo";bar";';
みたいなケースも考えるときついですね。
とりあえず、出直してきます。
0775nobodyさん04/10/14 02:46:56ID:???
>>758
1.sjis-winをutf8にする
2.utf8はsjisやeucのような途中マッチが起こらない
3.そのためにはソースもutf8で書いた方がよい
4.utf8でezweb文字列の正規表現を書く

うまくできたらソース晒してね
0776nobodyさん04/10/14 04:01:33ID:???
>>775
4. がうまくできるとは到底思えないのだが。
ていうか単に煽ってるだけか?
0777nobodyさん04/10/14 07:09:58ID:???
別に普通に出来るだろ
"\xF6\xCF" -> "\xEE\x93\xB6"
077877604/10/14 14:00:36ID:???
>>777
調べてみたら、
 - EZweb の絵文字は Shift_JIS のユーザ定義領域を使っていて、
 - Shift_JIS のユーザ定義領域は Unicode との対応が定義されている
なので、ちゃんと相互変換もできるし問題ないということなのかな。
漏れが無知だったようだ。すまん。
0779nobodyさん04/10/16 19:49:17ID:???
550から999までというのはどういう風に書けばよろしいでしょうか?
0780nobodyさん04/10/16 20:02:11ID:???
>>550-999
ってレス番の話じゃないのか?
0781nobodyさん04/10/16 20:06:43ID:???
>>780
レス番の話ではなく、数字の550から999までだけマッチングさせたいのです。
0782nobodyさん04/10/16 20:07:41ID:???
/[5-90][5-90][0-9]/
???
078378204/10/16 20:14:15ID:???
さっき正規表現勉強し出したアホです、
間違ってたらスマソ。
叩かないで(´・ω・`)
0784nobodyさん04/10/16 20:18:18ID:???
>>782
すみませんが、これですと2桁目に1から4が入るとマッチしなくありません?例えば640とか。
0785nobodyさん04/10/16 20:18:33ID:???
ifでいいじゃん
0786nobodyさん04/10/16 20:25:55ID:???
/(550|551|552|553(ry
0787nobodyさん04/10/16 20:27:24ID:???
>>786
いや、マヂで!?w
078878204/10/16 20:28:35ID:???
/5[5-90][0-9]|[6-90][0-9][0-9]/
こうかな?
0789nobodyさん04/10/16 20:29:43ID:???
>>788
もうおまえはレスしなくていいよ
せめて試してから書けよ
079078204/10/16 20:32:35ID:???
どうやって試すん?(´・ω・`)
0791nobodyさん04/10/16 20:35:49ID:???
>>788
おっ、なるほど、500台とそれ以降に分ければいいのですね!ありがとうございます、1つ賢くなりました(`・ω・´)
0792nobodyさん04/10/16 20:38:10ID:???
>>789
んじゃ喪前が素晴らしく簡潔な奴を披露したら?
0793nobodyさん04/10/16 20:38:37ID:???
>>791
いや、782間違ってるから
079478204/10/16 20:39:32ID:???
/5[5-90][0-9]|[6-9][0-9][0-9]/
0がひとつ多かったみたい
(・∀・)
0795nobodyさん04/10/16 20:41:25ID:???
自演乙
079678204/10/16 20:42:46ID:???
/5[5-9][0-9]|[6-9][0-9][0-9]/
これで最後・・・修行してきまつ
0797nobodyさん04/10/16 20:55:24ID:???
どういう文字列を調べたいのかわからんのによく答えられるな。
0798nobodyさん04/10/16 21:01:13ID:???
/(0|[5-9])[0-9][0-9]/
0799nobodyさん04/10/16 21:02:00ID:???
て、500〜だったな∧||∧

素直に/[5-9][0-9][0-9]/でいいんちゃうの?
0800nobodyさん04/10/16 21:03:45ID:???
あーもうシバキ倒してください
0801nobodyさん04/10/16 21:04:15ID:???
>797
馬鹿がキタ━━━━━━(゚∀゚)━━━━━━ !!
お前な、上のやつよーく見ろ。
0802nobodyさん04/10/16 21:05:12ID:???
>797 => >798 orz
このスレ馬鹿しかいないってことでFA?
0803nobodyさん04/10/16 22:19:30ID:???
>>781
if ($n =~ /[1-9]\d{2}/ and 550 <= $&) { マッチ; }
0804nobodyさん04/10/16 23:10:17ID:???
>>803
マジレスすんなよ!空気嫁!!
0805nobodyさん04/10/16 23:28:12ID:???
>804
だから?
080677904/10/17 00:19:04ID:???
779ですが、なんかうまくいったようです。みなさんありがとう。
0807nobodyさん04/10/17 00:28:58ID:???
>>804
まだ続けるつもりだったのか?どう見ても終焉の空気が流れてるだろ。食う清め。
0808nobodyさん04/10/18 04:08:53ID:aBkVRsoL
if($type =〜 /image\/.*/){

はどういう意味ですか?
0809nobodyさん04/10/18 04:13:49ID:???
おそらくcontent-typeかmime-typeかが画像であるかってことじゃない?
0810nobodyさん04/10/18 11:03:43ID:???
いや、'\' じゃなくて '\' だから、parse error・・・・
って、MLとマルチポストするなよ。
0811nobodyさん04/10/18 11:29:23ID:???
〜 これにはつっこまんのか
0812nobodyさん04/10/18 12:01:37ID:???

'\' 俺が悪いのか?
-


v'\'v そうさ。
 o
0813nobodyさん04/10/18 12:42:55ID:???
ML にはちゃんと半角で '~', '\' としてるからわかってそう書いてるんだと思うけど。

ていうか、記号をわざわざ全角で書いてるひとが多いけど、なんでなんでしょ?
'&' や '"' と同じような罠にはまるのを避けてるのかな?
0814nobodyさん04/10/18 13:11:12ID:???
>>813
SafariだとASCII or Unicode以外でポストするとき、迷惑にも
? -> \, ? -> 〜 に変換しやがるのです。
0815nobodyさん04/10/18 13:13:22ID:???
なぜか数値参照が化けた..orz
バックスラッシュ・チルダが全角バックスラッシュ・全角ウェーブダッシュにされるんです。
0816nobodyさん04/10/18 13:43:13ID:???
そうだったのかあ。
よくプログラミングネタや UNIX のトラブルシュートネタで、
コードやエラーメッセージをそのまま貼れ、って言うことがあるけど、
そういうのがあるとすると厄介ですなあ。
0817nobodyさん04/10/22 17:38:02ID:xzmN9eHo
perlのサブルーチンを抜き出すような正規表現はどう書けばいいでしょうか?
言語はperlです。

-----------
sub aaa{
1
2
}
\n
sub bbb{
3
}
\n
\n
------------
この場合

-----------
aaa{
1
2
}
\n
と
bbb{
3
}
\n
\n
と
出力したいのですが。
よろしくお願いします。
0818nobodyさん04/10/22 18:28:19ID:???

つまらん
081981704/10/23 01:25:36ID:fB1MfhBi
そう言わず、ヒントだけでも下さい!
0820 ◆7CWqH7Oesg 04/10/23 13:26:33ID:???
$data=~ s/[\x0A\x0D]=\w+.*?=cut//gs;
$data=~ s/([\s;{}]*)#[^\x0A\x0D]*/$1/g;
$data=~ s/[\x0A\x0D]__(?:END|DATA)__.*//s;
@result= $data=~ /\s+sub\s+([a-zA-Z_]\w*\s*(?:\([^)]*\))?\s*\{(?:[^}]|\{[^}]*\})*\})/g;

これでどう?
0821nobodyさん04/10/23 13:52:56ID:fB1MfhBi
$data = "sub aaa{\n1\n2\n}\n\nsub bbb{\n3\n}\n\n\n";

$data=~ s/[\x0A\x0D]=\w+.*?=cut//gs;
$data=~ s/([\s;{}]*)#[^\x0A\x0D]*/$1/g;
$data=~ s/[\x0A\x0D]__(?:END|DATA)__.*//s;
@result= $data=~ /\s+sub\s+([a-zA-Z_]\w*\s*(?:\([^)]*\))?\s*\{(?:[^}]|\{[^}]*\})*\})/g;

print @result;

を実行しても

bbb{
3
}

しか表示できません。
0822 ◆7CWqH7Oesg 04/10/23 14:01:51ID:???
>>821

@result= $data=~ /\s+sub
を以下に変えないといけないようだ。

@result= $data=~ /(?:^|\s|=)sub
0823nobodyさん04/10/29 01:30:56ID:???
「直前が{でも}でもない改行を削除」を性器表現するとどうなりますか?
0824nobodyさん04/10/29 02:15:48ID:???
>>823
実装言語を言わずに回答が欲しいですかそうですか
0825nobodyさん04/10/29 02:35:07ID:???
実装言語はなんでもいいです、でもいいですが、とりあえずはPerlでよろしくです。
0826nobodyさん04/10/29 03:55:33ID:???
>>823
s/([^\^{}])\n/$1/g; # unixの改行
s/([^\^{}])\r\n/$1/g; # windowsの改行
s/([^\^{}])\r/$1/g; # Macの改行
0827nobodyさん04/10/29 06:16:46ID:???
また丸投げかよ
082882604/10/29 12:08:28ID:???
ごめn、まちがった。
s/(^|[^{}])\n/$1/g;
だた。
0829nobodyさん04/10/29 13:38:27ID:???
これでもよくね? s/([^{}])\n/$1/g;

>>823
次に質問するときはちょっとでも努力の跡を見せれ。
0830nobodyさん04/10/29 13:51:59ID:???
すまない、そしてありがとう。
829でできました。
0831nobodyさん04/10/29 15:00:41ID:???
828、829とも改行が続く場合に削除できない。
また、829では先頭の改行を削除できない。
直前のパターンを指定する場合、普通は
(?<=PATTERN) や (?<!PATTERN) を使う。
この場合なら、s/(?<![{}])\n//g; とする。

>>829
次に回答するときはちょっとでも試行の跡を見せれ。
0832nobodyさん04/10/29 15:14:32ID:???
>>831
改行が続く場合と、先頭の改行の違いを述べよ。
828が正解。
実際に試してから偉そうなこと言えよな。
0833nobodyさん04/10/29 16:20:34ID:???
>>823-832
# 「直前が { もしくは } の改行のみ残る」なら、これは3行になる筈
my $orig = "\n\nfoo\n\n{\nbar\n}\n\nbaz\n\n";

(my $copy = $orig) =~ s/(^|[^{}])\n/$1/g; # 828
print "[$copy]\n";
# [
# foo
# {
# bar}
# baz]
# … NG.

($copy = $orig) =~ s/(?<![{}])\n//g; # 831
print "[$copy]\n";
# [foo{
# bar}
# baz]
# … OK.
0834nobodyさん04/10/29 16:25:51ID:???
>>832
$_ = <<EOH;

abc

123
EOH
の時、1行目のが「先頭の改行(^\n)」で、
abcの後ろと次の空行の改行が「続く改行(\n\n+)」。

これを>>828に通すと
abc
123
となり、>>831に通すと
abc123
となる。
{ と } の後ろ以外の改行は消すんだったよな?
恥の上塗りご苦労。
0835nobodyさん04/10/29 16:32:05ID:???
>>832
833-834を踏まえた上で、828が正解である根拠を述べよ。
831が正解。
頭良くなってから偉そうなこと言えよな。
0836nobodyさん04/10/29 16:34:53ID:???
>>833=>>834
ばか?変数に入れたものなんか誰も処理しないよ。
変数に書いてる間にエディタで取った方が速いよ。
普通のファイルでやって皆。
--------

foo


{

bar

}


baz


-----------
0837nobodyさん04/10/29 16:38:48ID:???
>>836
>>825は「とりあえずはPerlでよろしく」と言ってるわけだが。
083882504/10/29 16:40:55ID:???
解決したんでもうやめれ。
0839nobodyさん04/10/29 16:43:14ID:???
>>834
いちいちヒアドキュメントなんか書いてる間に
(あるいはスクリプトに挿入してEOHなんてやってる
間に)エディタの置換でやったほうが速いよ。
>>831が間違いだと言ってないからな。
ただ、否定の?は遅いからな(プッ
0840nobodyさん04/10/29 16:46:04ID:???
ということで、828が最善解。
0841nobodyさん04/10/29 17:58:19ID:jREmvBrx
JavaScriptの正規表現使って文字列の先頭と最後の空白を取りたいのですが
どう書けばいいのでしょうか?
abc dfg hij a
を(先頭と最後に3つ空白がある)
abc dfg hij a

みたいにしたいのです。

教えてください。
0842nobodyさん04/10/29 18:24:10ID:???
>>841
str = " abc dfg hij a ".replace(/^\s+|\s+$/g, "");
分かりやすく、前後のスペースは全角にしたので注意。
.replaceを適用した文字列や変数自身は置換されないので、
結果を受け取る必要あり。
0843nobodyさん04/11/02 02:39:16ID:???
/*str1*/str2/*str3*/
という文字列があって/*〜*/の部分をereg_replaceで空文字列に置き換えようとしたとき

ereg_replace("(/\*.*\*/)","","/*str1*/str2/*str3*/");
てやると、先頭の/*と末尾の*/がマッチして全部消えるんだけど
test2は残して、test1とtest3だけ消す方法ってある?
0844nobodyさん04/11/02 04:38:17ID:???
test?
( ゚Д゚)
0845nobodyさん04/11/02 06:03:36ID:???
(/\*.*?\*/)
0846nobodyさん04/11/02 12:08:40ID:???
(/\*([^*]|\*+[^/*])*\*+/)
084784304/11/02 15:34:08ID:TAdMjWDI
すまそ…激しく誤植だった。
>ereg_replace("(/\*.*\*/)","","/*str1*/str2/*str3*/");
>てやると、先頭の/*と末尾の*/がマッチして全部消えるんだけど
>str2は残して、str1とstr3だけ消す方法ってある?
でした。

>>846サソ
(/\*([^*]|\*+[^/*])*\*+/)で、できました〜
ありがとうございました。
0848あぼーんNGNG
あぼーん
0849nobodyさん04/11/04 12:11:00ID:???
perlでEUC以外の文字列を削除するスクリプトを作成しましたが、
エラーが出てしまい困っています。
削除前には他の文字コードの場合にはEUCに変換しています。

$pattern部分はperlメモさんを参考にしています。

my $str = ' aaaa bbb ccc dddd';
my $pattern = '(?:[\xA9-\xAF\xF5-\xFE][\xA1-\xFE]|' # 9-15,85-94区
. '\x8E[\xE0-\xFE]|' # 半角カタカナ
. '\xA2[\xAF-\xB9\xC2-\xC9\xD1-\xDB\xEB-\xF1\xFA-\xFD]|' # 2区
. '\xA3[\XA1-\xAF\xBA-\xC0\xDB-\xE0\xFB-\xFE]|' # 3区
. '\xA4[\xF4-\xFE]|' # 4区
. '\xA5[\xF7-\xFE]|' # 5区
. '\xA6[\xB9-\xC0\xD9-\xFE]|' # 6区
. '\xA7[\xC2-\xD0\xF2-\xFE]|' # 7区
. '\xA8[\xC1-\xFE]|' # 8区
. '\xCF[\xD4-\xFE]|' # 47区
. '\xF4[\xA7-\xFE]|' # 84区
. '\x8F[\xA1-\xFE][\xA1-\xFE])'; # 3バイト文字
$str =~ s/[^$pattern]//g;
print $str;

どなたかご教授ください。
0850nobodyさん04/11/04 12:23:58ID:???
$pattern = " ";
にしないと展開されないんじゃない?
0851nobodyさん04/11/04 14:35:28ID:???
ヒント: Perlメモには、Perl正規表現雑技へ というリンクがある
085284904/11/04 15:54:14ID:???
>>851
いろいろやってみたけど、上手くいきません・・・
0853nobodyさん04/11/04 17:48:33ID:???
文字列に「\」という文字を含めたい場合は、
クォートに関係なく「\\」と書かないとダメ。
0854nobodyさん04/11/05 06:33:14ID:???
>>894
文字クラスに正規表現は使えないのでは。
マッチングパターンを全部逆(EUCコード以外にマッチ)にすれば良いし、
面倒なら、マッチしたEUCコードを取り出すようにすれば良いと思う。

my $pattern = '([\xA9-\xAF\xF5-\xFE][\xA1-\xFE]|' # 9-15,85-94区
...

my $str2;
$str =~ s/$pattern/$str2 .= $1/geo;
print $str2;
085584904/11/05 10:36:41ID:???
みなさんありがとうございます。
まだテストしてないので試してみます。
本当にありがとうございます。
0856nobodyさん04/11/06 16:21:10ID:oGen/DNT
test#・・・・の文字列の#以降の文字を任意の文字に置き換えたいです。
トリップみたいなことです。
splitではできたんですが、replaceではできませんでした。
replaceでやる方法はありますでしょうか?
よろしくお願いします。
0857nobodyさん04/11/06 16:47:50ID:???
>>856
まずは split でどうやったか示してもらおうか
0858nobodyさん04/11/09 20:14:47ID:???
>>856に返答がなくてじれったい!

$hoge = "任意の文字";
s/#.*/$hoge/;

でいいよな。
0859nobodyさん04/11/14 12:57:00ID:???
いま、Perlで文字列検索のCGIプログラムを作っているところなのですが、
やっているうちに挙動が変なところがあるのに気づきました。
エラー部分のみを挙げます。

$a="北関";
$b="夢";

if($a =~ /$b/){
 print 'OK!';
}else{
 print 'NG!';
}

これをEUCで記述すると「OK!」と表示、つまり「北関」の中に「夢」がヒットしてしまいます。
Shift_JISでは「NG!」、ヒットしません。
EUCでも正しく動作するように出来ないでしょうか?
おそらく、「北」「関」のJISコード(それぞれ4B4C、3458)が「夢」のJISコード(4C34)にかぶることが原因だと思いますが、
これをうまく回避する方法を検索することが出来ませんでした。
ご教授いただければ幸いです。
0860nobodyさん04/11/14 19:14:58ID:???
Perl 5.8以降なら

use encoding "euc-jp";

my $a = "\xcb\xcc\xb4\xd8";
my $b = "\xcc\xb4";
print ($a =~ /$b/ ? 'OK!' : 'NG!');

--
String::Multibyteをインストールするなら

use String::Multibyte;

my $euc = String::Multibyte->new('EUC_JP');
my $a = "\xcb\xcc\xb4\xd8";
my $b = "\xcc\xb4";
print ($euc->index($a, $b) >= 0 ? 'OK!' : 'NG!');

--
自力で解決

my $a = "\xcb\xcc\xb4\xd8";
my $b = "\xcc\xb4";
my $euc = "^(?:[\x00-\x7e]|\xfe?[\xa0-\xff][\xa0-\xff]|\x8e[\xa0-\xff])*";
print ($a =~ /$euc$b/ ? 'OK!' : 'NG!');
086185904/11/14 23:27:07ID:???
>>860
ご教授、ありがとうございました!
期待したとおりの効果を得ることが出来ました。
感謝いたします。
0862nobodyさん04/11/18 15:33:53ID:z5HMJmKG
hoge=aaa
hoge=aaa&piyo=bbb
のような文字列の「aaa」だけを抜き出すには
"/hoge=(.+?)/"
       ↑ここになにを入れればいいのでしょうか?
0863nobodyさん04/11/18 15:39:06ID:???
>>862
"/hoge=(.+?)&/"
086486204/11/18 18:40:51ID:???
>>863
レスありがとうございます。
でも、それだと上の行のaaaが抜き出せないです。
ちなみに、最後に改行コードはついていません。

$a = 'hoge=aaa';
$b = 'hoge=aaa&piyo=bbb';

といった感じのデータです。
0865nobodyさん04/11/18 19:08:47ID:???
>>864
/hoge=[^&]+/
086686204/11/18 19:45:25ID:???
>>865
ありがとございます。
すごい単純なことを落としていました。
&を除くものを取得すれば良いんでした。
0867nobodyさん04/11/19 20:49:42ID:???
半角の英数記号のみにマッチする正規表現ってどうなりますか?
(制御文字はマッチしない)
半角英数のみなら良く見るのですが。
0868nobodyさん04/11/19 21:03:27ID:???
>>867
> 半角英数のみなら良く見るのですが。
じゃあそいつから数を除けばいいだろ
0869nobodyさん04/11/19 21:03:56ID:???
↑読み間違えた。
0870nobodyさん04/11/19 21:04:54ID:???
記号足せばいいんでないかと
■ このスレッドは過去ログ倉庫に格納されています