正規表現道場@2ch Part3 s/煽り|荒らし/あぼーん/g
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
03/11/19 21:42ID:Kst3Nn4Sこのスレは有用そうな正規表現を紹介したり、どう表現したらいいかわからないときに質問をしたりするためのスレッドです。
質問するときは使用言語や得たい結果をなるべく詳しく書きましょう。
註:& や " を書くときには、& " と描いておきましょうね。
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/
0786nobodyさん
04/10/16 20:25:55ID:???0788782
04/10/16 20:28:35ID:???こうかな?
0790782
04/10/16 20:32:35ID:???0794782
04/10/16 20:39:32ID:???0がひとつ多かったみたい
(・∀・)
0795nobodyさん
04/10/16 20:41:25ID:???0796782
04/10/16 20:42:46ID:???これで最後・・・修行してきまつ
0797nobodyさん
04/10/16 20:55:24ID:???0798nobodyさん
04/10/16 21:01:13ID:???0799nobodyさん
04/10/16 21:02:00ID:???素直に/[5-9][0-9][0-9]/でいいんちゃうの?
0800nobodyさん
04/10/16 21:03:45ID:???0801nobodyさん
04/10/16 21:04:15ID:???馬鹿がキタ━━━━━━(゚∀゚)━━━━━━ !!
お前な、上のやつよーく見ろ。
0802nobodyさん
04/10/16 21:05:12ID:???このスレ馬鹿しかいないってことでFA?
0805nobodyさん
04/10/16 23:28:12ID:???だから?
0806779
04/10/17 00:19:04ID:???0808nobodyさん
04/10/18 04:08:53ID:aBkVRsoLはどういう意味ですか?
0809nobodyさん
04/10/18 04:13:49ID:???0810nobodyさん
04/10/18 11:03:43ID:???って、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:???ていうか、記号をわざわざ全角で書いてるひとが多いけど、なんでなんでしょ?
'&' や '"' と同じような罠にはまるのを避けてるのかな?
0814nobodyさん
04/10/18 13:11:12ID:???SafariだとASCII or Unicode以外でポストするとき、迷惑にも
? -> \, ? -> 〜 に変換しやがるのです。
0815nobodyさん
04/10/18 13:13:22ID:???バックスラッシュ・チルダが全角バックスラッシュ・全角ウェーブダッシュにされるんです。
0816nobodyさん
04/10/18 13:43:13ID:???よくプログラミングネタや UNIX のトラブルシュートネタで、
コードやエラーメッセージをそのまま貼れ、って言うことがあるけど、
そういうのがあるとすると厄介ですなあ。
0817nobodyさん
04/10/22 17:38:02ID:xzmN9eHo言語は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:???つまらん
0819817
04/10/23 01:25:36ID:fB1MfhBi$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=~ 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
}
しか表示できません。
@result= $data=~ /\s+sub
を以下に変えないといけないようだ。
@result= $data=~ /(?:^|\s|=)sub
0823nobodyさん
04/10/29 01:30:56ID:???0825nobodyさん
04/10/29 02:35:07ID:???0826nobodyさん
04/10/29 03:55:33ID:???s/([^\^{}])\n/$1/g; # unixの改行
s/([^\^{}])\r\n/$1/g; # windowsの改行
s/([^\^{}])\r/$1/g; # Macの改行
0827nobodyさん
04/10/29 06:16:46ID:???0828826
04/10/29 12:08:28ID:???s/(^|[^{}])\n/$1/g;
だた。
0830nobodyさん
04/10/29 13:51:59ID:???829でできました。
0831nobodyさん
04/10/29 15:00:41ID:???また、829では先頭の改行を削除できない。
直前のパターンを指定する場合、普通は
(?<=PATTERN) や (?<!PATTERN) を使う。
この場合なら、s/(?<![{}])\n//g; とする。
>>829
次に回答するときはちょっとでも試行の跡を見せれ。
0833nobodyさん
04/10/29 16:20:34ID:???# 「直前が { もしくは } の改行のみ残る」なら、これは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:???$_ = <<EOH;
abc
123
EOH
の時、1行目のが「先頭の改行(^\n)」で、
abcの後ろと次の空行の改行が「続く改行(\n\n+)」。
これを>>828に通すと
abc
123
となり、>>831に通すと
abc123
となる。
{ と } の後ろ以外の改行は消すんだったよな?
恥の上塗りご苦労。
0835nobodyさん
04/10/29 16:32:05ID:???833-834を踏まえた上で、828が正解である根拠を述べよ。
831が正解。
頭良くなってから偉そうなこと言えよな。
0836nobodyさん
04/10/29 16:34:53ID:???ばか?変数に入れたものなんか誰も処理しないよ。
変数に書いてる間にエディタで取った方が速いよ。
普通のファイルでやって皆。
--------
foo
{
bar
}
baz
-----------
0838825
04/10/29 16:40:55ID:???0839nobodyさん
04/10/29 16:43:14ID:???いちいちヒアドキュメントなんか書いてる間に
(あるいはスクリプトに挿入してEOHなんてやってる
間に)エディタの置換でやったほうが速いよ。
>>831が間違いだと言ってないからな。
ただ、否定の?は遅いからな(プッ
0840nobodyさん
04/10/29 16:46:04ID:???0841nobodyさん
04/10/29 17:58:19ID:jREmvBrxどう書けばいいのでしょうか?
abc dfg hij a
を(先頭と最後に3つ空白がある)
abc dfg hij a
みたいにしたいのです。
教えてください。
0842nobodyさん
04/10/29 18:24:10ID:???str = " abc dfg hij a ".replace(/^\s+|\s+$/g, "");
分かりやすく、前後のスペースは全角にしたので注意。
.replaceを適用した文字列や変数自身は置換されないので、
結果を受け取る必要あり。
0843nobodyさん
04/11/02 02:39:16ID:???という文字列があって/*〜*/の部分をereg_replaceで空文字列に置き換えようとしたとき
ereg_replace("(/\*.*\*/)","","/*str1*/str2/*str3*/");
てやると、先頭の/*と末尾の*/がマッチして全部消えるんだけど
test2は残して、test1とtest3だけ消す方法ってある?
0844nobodyさん
04/11/02 04:38:17ID:???( ゚Д゚)
0845nobodyさん
04/11/02 06:03:36ID:???0846nobodyさん
04/11/02 12:08:40ID:???0847843
04/11/02 15:34:08ID:TAdMjWDI>ereg_replace("(/\*.*\*/)","","/*str1*/str2/*str3*/");
>てやると、先頭の/*と末尾の*/がマッチして全部消えるんだけど
>str2は残して、str1とstr3だけ消す方法ってある?
でした。
>>846サソ
(/\*([^*]|\*+[^/*])*\*+/)で、できました〜
ありがとうございました。
0848あぼーん
NGNG0849nobodyさん
04/11/04 12:11:00ID:???エラーが出てしまい困っています。
削除前には他の文字コードの場合には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:???にしないと展開されないんじゃない?
0851nobodyさん
04/11/04 14:35:28ID:???0853nobodyさん
04/11/04 17:48:33ID:???クォートに関係なく「\\」と書かないとダメ。
0854nobodyさん
04/11/05 06:33:14ID:???文字クラスに正規表現は使えないのでは。
マッチングパターンを全部逆(EUCコード以外にマッチ)にすれば良いし、
面倒なら、マッチしたEUCコードを取り出すようにすれば良いと思う。
my $pattern = '([\xA9-\xAF\xF5-\xFE][\xA1-\xFE]|' # 9-15,85-94区
...
my $str2;
$str =~ s/$pattern/$str2 .= $1/geo;
print $str2;
0855849
04/11/05 10:36:41ID:???まだテストしてないので試してみます。
本当にありがとうございます。
0856nobodyさん
04/11/06 16:21:10ID:oGen/DNTトリップみたいなことです。
splitではできたんですが、replaceではできませんでした。
replaceでやる方法はありますでしょうか?
よろしくお願いします。
0859nobodyさん
04/11/14 12:57:00ID:???やっているうちに挙動が変なところがあるのに気づきました。
エラー部分のみを挙げます。
$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:???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!');
0862nobodyさん
04/11/18 15:33:53ID:z5HMJmKGhoge=aaa&piyo=bbb
のような文字列の「aaa」だけを抜き出すには
"/hoge=(.+?)/"
↑ここになにを入れればいいのでしょうか?
0864862
04/11/18 18:40:51ID:???レスありがとうございます。
でも、それだと上の行のaaaが抜き出せないです。
ちなみに、最後に改行コードはついていません。
$a = 'hoge=aaa';
$b = 'hoge=aaa&piyo=bbb';
といった感じのデータです。
0867nobodyさん
04/11/19 20:49:42ID:???(制御文字はマッチしない)
半角英数のみなら良く見るのですが。
0869nobodyさん
04/11/19 21:03:56ID:???0870nobodyさん
04/11/19 21:04:54ID:???0871nobodyさん
04/11/19 21:05:09ID:???0872nobodyさん
04/11/20 08:08:33ID:2uxiNSVv正規表現でマッチさせる事とか出来ませんでしょうか?
↓こんな感じの部分を色分けしたいんですが。
print <<< PRINT_HTML
<div class="box">
<b>ぬるぽ</b>
</div>
PRINT_HTML;
0873nobodyさん
04/11/21 08:46:27ID:baqdUP4H0874nobodyさん
04/11/21 17:13:13ID:bKPK+kaXヒアドキュメントが醜いからPerlは結構嫌われているわけで
PHPは変数内でも改行できるという点から
PHPでヒアドキュメントは使わない方がいいと思うけど。
0876nobodyさん
04/11/21 23:14:38ID:???自分はサクラエディタとやらは使わないしPerlしかやらないが、
良ければこれを参考にしてくれ。
/<<<s*([a-zA-Z0-9_]+)\n.*?n\1;/
主な条件は、後方参照ができること(\1が使える)と、
複数行のマッチができること(.に\nを含ませる)。
できれば .*? を (.*?) として、$2で抜き出せれば理想的なんだが。
0877nobodyさん
04/11/22 00:27:02ID:???874ではないが874に同意だな
ヒアドキュメントははっきり言って見にくい
確かにPHPで使ってるとなぜ使うのか疑問になる
これは人それぞれの慣れと書き方だと思うけどね
0878nobodyさん
04/11/22 00:32:29ID:???0879nobodyさん
04/11/22 04:03:50ID:???$str =~ s/ //g;
ってやっても文字化けするケースと
そのまま正常なケースがあるんだがなんでだろ?
Perlメモを見て
$Zspace = '(?:\xA1\xA1)';
$str =~ s/$Zspace//g;
でやっても無理だった
0880nobodyさん
04/11/22 05:48:42ID:???たまたま、前の文字の最後が \xA1 で後の文字の最初が \xA1 に
マッチするようなケースにあたるとまずくなるよね。
0882872
04/11/22 06:45:50ID:C8SlIvxcそ、そうなんですか!?
自分的には、変数を直接使用でき、「"」や「'」をエスケープする必要が無く、
HTMLソースをそのままコピペ出来るので、なかなか使いやすいと思っていたのですが…
ちなみにこんな感じで書いてるんですが、邪道なんでしょうか…
http://cyberbooth.fc2web.com/admin.html
>>876
ご教示をありがとうございます!
そのコードを参考に色々と自分で試してみます。
まだPHPは5日程前に始めたばかりでして、
どうもまだこの「正規表現」に苦戦していましたので、非常に助かりました。
0883nobodyさん
04/11/22 07:24:57ID:???変数直接書けるけど
{}で囲ったりしないと後ろの文字が変数名の続きと勘違いしてしまうケースあるし
何よりほとんどのテキストエディタで対応してない
使ったあとの自動インデントが狂うエディタ多数
ヒアドキュメントは確かに便利であるし機能としてあるから邪道ではないと思うが
ttp://www.kauda.jp/~suguru/comp/php/strings.html
とか書いてるけどPHPではいらんっぽい
ただPerl出身者はおそらくヒアドキュメント大好き人ばっかだと思う
組んでるときはいいけど作った後に見ると見にくいって感じかな
>>877の通り、最後は好き嫌いのレベルなんだけどね
0884nobodyさん
04/11/22 20:51:42ID:???Perl なら Template Kit, PHP なら Smarty ばっか使ってるぞ
スレ違いだな、すまん
0885nobodyさん
04/11/22 21:24:40ID:???ヒアドキュメントってほんとに必要かなあ、って思ってしまう。
■ このスレッドは過去ログ倉庫に格納されています