正規表現道場@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/
0771nobodyさん
04/10/13 20:05:36ID:???0772nobodyさん
04/10/13 20:10:59ID:???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:???サンクス。とりあえずそれでできましたが、
$text = '$a = "foo";bar";';
みたいなケースも考えるときついですね。
とりあえず、出直してきます。
0775nobodyさん
04/10/14 02:46:56ID:???1.sjis-winをutf8にする
2.utf8はsjisやeucのような途中マッチが起こらない
3.そのためにはソースもutf8で書いた方がよい
4.utf8でezweb文字列の正規表現を書く
うまくできたらソース晒してね
0777nobodyさん
04/10/14 07:09:58ID:???"\xF6\xCF" -> "\xEE\x93\xB6"
0778776
04/10/14 14:00:36ID:???調べてみたら、
- EZweb の絵文字は Shift_JIS のユーザ定義領域を使っていて、
- Shift_JIS のユーザ定義領域は Unicode との対応が定義されている
なので、ちゃんと相互変換もできるし問題ないということなのかな。
漏れが無知だったようだ。すまん。
0779nobodyさん
04/10/16 19:49:17ID:???0782nobodyさん
04/10/16 20:07:41ID:??????
0783782
04/10/16 20:14:15ID:???間違ってたらスマソ。
叩かないで(´・ω・`)
0785nobodyさん
04/10/16 20:18:33ID:???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:???■ このスレッドは過去ログ倉庫に格納されています