正規表現道場@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/
0191189
04/02/12 02:40ID:???/^..\(.\)\1\(.\)\2/
でいいんじゃない?
0192nobodyさん
04/02/12 02:44ID:???Perlで\1とかが使えるのは知ってたのですが、sedでもつかえるとは思って無かったです。
ぶしつけがましいかもしれませんが、Perlで!~と表される「マッチ以外」を
sedで実装するにはどうすればいいのでしょうか。
実は今回初めてsedというものに触れることになったもので・・・
Perlみたく正規表現が使える、というのは知ってたのですが仕様が違うらしくうまくいかなくて・・・
0195nobodyさん
04/02/12 23:51ID:???http://(.)+\.2ch\.net/test/read\.cgi/(.)+/[0-9]{10}/
これでいいですか?
もうちょっとスマートなのあればお願いします。
0196nobodyさん
04/02/13 04:16ID:???0198nobodyさん
04/02/13 17:38ID:???ごめんなさい。素人なものでよくわからないのです・・・
任意の文字は、「(..)+」じゃないんでしょうか・・・
「.+」でいいですか?
http://(.+\.2ch\.net|.+\.bbspink\.com|.+\.machi\.to)/test/read\.cgi/.+/[0-9]{10}/
でいいでしょうか?
それと、Perlでは、10個の数字なら「\10d」でできたと思うのですが、PHPではできないみたいですね・・・
0199195
04/02/13 22:04ID:???http://([a-zA-Z0-9]+\.2ch\.net|[a-zA-Z0-9]+\.bbspink\.com|[a-zA-Z0-9]+\.machi\.to)/test/read\.cgi/[a-zA-Z0-9]+/[0-9]{10}/
これでOKですね。
0200nobodyさん
04/02/14 02:42ID:???0201nobodyさん
04/02/14 12:38ID:???次の文字列で、<!--from-->〜<!--to-->部分を除去する
正規表現が分からないです。
"あい<!--from-->か<>き<!--to-->うえ<!--from-->くけ<>こ<!--to-->お"
→「あいうえお」を取り出したい
自作の失敗正規表現
/<\!--from-->.*<\!--to-->//g
→「あいお」になってしまう。
0208nobodyさん
04/02/14 23:14ID:???今は
$title =~ s/.*?( alt=\".*?\")*/$1/gs;
$title =~ s/alt="//g;
$title =~ s/"//g;
とやっていますが、効率が悪いと言われました。
0211nobodyさん
04/02/14 23:43ID:???alt属性値は複数ある可能性もあるんです(<img>タグの個数が分からないため)
0212nobodyさん
04/02/14 23:49ID:???で、求めたいことをやるコードなら、今、プログラム板の
Perl質問箱でも答えたとこだが、
@title = ($_ =~ /.*? alt=\"(.*?)\"*/$1/g);
でよろしかろう。
0213nobodyさん
04/02/15 00:04ID:???ヒントを得られたので改変して自己解決しました。
$title =~ s/.*?alt=\"([^"]*)[^(alt)]*/$1/gs;
これでできました。
どうもありがとうございました。
0216nobodyさん
04/02/15 00:24ID:???何か問題があるんでしょうか・・・汗
0217nobodyさん
04/02/15 00:28ID:???alt="〜"以降にaかlかtが含まれるとそれ以降がおかしな事に・・・
0218nobodyさん
04/02/15 02:32ID:???0219nobodyさん
04/02/15 02:58ID:P41SZm3C90020E68E8D0320A9028D14FF40AE7307BD5A8...
これに16文字ごとに00を挿入するにはどう書けばいいでしょうか?
こんな感じに出力したいのですが
0090020E68E8D0320A009028D14FF40AE730007BD5A8...
自分でチュートリアルみながらやってみたら
アホみたいに00で溢れてしまいました・・・
0221219
04/02/15 04:05ID:???$output =~ s/\(................\)/00\1/gs;
0222nobodyさん
04/02/15 04:20ID:???$output =~ s/([0-9A-Z]{16})/\1xx/gs;
print $output;
00ができねー。
0223nobodyさん
04/02/15 04:23ID:???$output =~ s/([0-9A-Z]{16})/00\1/gs;
print $output;
頭00つきで・・・。
0225nobodyさん
04/02/15 04:29ID:???$output =~ s/([0-9A-F]{16})/$1_/g;
$output =~ s/_/00/g;
0227219
04/02/15 05:27ID:???無事できますた
0228>>208
04/02/15 09:16ID:???$title =~ s/.*?alt=\"([^"]*)[^a]*?/$1$2/gs;
$title =~ s/([^"]*).*/$1/gs;
「alt」っていう文字列が出てくるまで、ってどういう風に表現するんでしょうか・・・・
紹介された他のスクリプトは全て期待通りの動きをしませんでした
$title=<<END;
<h1><img src="./hoge.png" width="10" height="10" alt="alt属性値"></h1>
<div id="id">
テストaltテスト<br>
</div>
<h2><img src="./hoge2.png" width="10" height="10" alt="alt属性値2"><img src="./hoge3.png" width="10" height="10" alt="alt属性値3"></2>
<div id="id">
テストaltテスト<br>
</div>
END
これに正規表現をかけて、$titleの中身を
alt属性値alt属性値2alt属性値3
に出来ればかなり近いものになると思うんですが・・・・
0229未承諾広告※ ◆aiY4htt2.2
04/02/15 10:17ID:???0230nobodyさん
04/02/15 10:55ID:???0231nobodyさん
04/02/15 16:22ID:???0232nobodyさん
04/02/16 14:35ID:???print 'ごめんなさい' if m(_ _)m;
0233
04/02/21 11:23ID:ZPsBKiYf私は↓のサイトで、サッカーの試合後に出される選手の採点をVBScriptを使って集計しております。
http://www.geocities.co.jp/SiliconValley-SanJose/8260/shukeihouhou040220/shukeihouhou.html
例えば、 「中田:6.5」というカキコを読み込むのに
re.Pattern = "([a-zA-Zぁ-んァ-ヶー−一-鶴]+)[ ;:;:…]*(10\.0|10|9\.5|9\.0|9|8\.5|8\.0|8|7\.5|7\.0|7|6\.5|6\.0|6|5\.5|5\.0|5|4\.5|4\.0|4|3\.5|3\.0|3|2\.5|2\.0|2|1\.5|1\.0|1|0\.5|0\.0|0)"
とパターンを設定しているのですが、
2つの問題に直面しております。
一つの問題は選手名の読み込みです。
漢字コードの設定がうまくないために取り込めない選手がいます。
今のところ、「黒部」が「部」になってしまうということが起きています。
もう一つの問題は点数の読み込みです。
採点では0.0〜10.0まで0.5刻みで点数を評価します。
それ以外の数字は無視しようと思うのですが、
3.14だと3と認識してような現象がおきているようです。
以前はjperlで認識させてまして漢字コードに関しては
[a-zA-Zぁ-んァ-ヶー−亜-腕弌-熙]+
でやってて問題は起きなかったですが、VBSでは無理なようです。
適当に文字コード表を開いたら漢字が一で始まって鶴で終わってたので
これを適用したら、そこそこうまくいったのですが、「黒」はだめなようで・・・
0234nobodyさん
04/02/21 13:17ID:???鶴のうしろに、
鷲 鷹 鷺 鹸 鹿 麓 麗 麟 麦 麹 麺 麻 麿 黄 黍 黒 黙 黛 鼎 鼓 鼠 鼻 齢 龍
これだけの文字が残ってるよ。
しかし、JScriptはUNICODEで範囲指定しなきゃならんのか……
あと、置換で面倒なことしてるとおもったら、trがないのか……
ドキュメントのRegExp.Execute()のところにSubMatchesコレクションの記述がまったくない……
0235nobodyさん
04/02/21 14:01ID:X1kd7Gnd$short = 'hoge++';
という場合に
$long = 'hogehoge++';
にマッチするかどうか判定するにはどうしたらいいですか。
if ($long =~ /$short/) {}
だと ++ の部分でエラーが出ちゃうです。
0236
04/02/21 14:14ID:ZPsBKiYfありがとうございます。「黒部」が読み込めました。
選手名はこれでいけたっぽいです。
>置換で面倒なことしてるとおもったら、trがないのか
どうなんでしょうね。おいらが探しきれなかっただけかも・・・
>RegExp.Execute()のところにSubMatchesコレクションの記述がまったくない
すいません、意味わかんないっす
0237nobodyさん
04/02/21 14:17ID:???VBSは良く分からないけど、
(10|[0-9](\.[05])?)([^\.0-9]|$)
得点はこんな感じでどうでしょ。
>>235
Perlなら
if ($long =~ /\Q$short/) {}
0239
04/02/21 15:28ID:ZPsBKiYfありがとうございます。
しかしそれだと10.0が読み込めないようです。
(10\.0|10|[0-9](\.[05])?)([^\.0-9]|$)
こうすればいいのかな?
0241
04/02/21 16:31ID:ZPsBKiYf�dクス!!ありがとうございます。
これで解決です。
0242nobodyさん
04/02/21 16:44ID:TmSpuw1E許可したい場合どうしますか?
if($FORM{'name'} =~ /\w/g) { &error; }
や
if($FORM{'name'} !~ /\W/g) { &error; }
if($FORM{'name'} =~ /[a-zA-Z0-9]/g) { &error; }
では、カタカナを受け付けなくなってしまい、
if($FORM{'name'} !~ /\W/g) { &error; }
if($FORM{'name'} =~ /[A-Z0-9]/g) { &error; }
だと、アルファベット小文字が使えてしまいます。
0247nobodyさん
04/02/21 21:32ID:???0248nobodyさん
04/02/21 21:49ID:???PerlはEUCじゃないとマルチバイトの処理できない
0249247
04/02/21 21:54ID:???文字である以上、文字コードだろ?
文字コードは変動しないよな?
できるじゃん!
0251247
04/02/21 22:20ID:???SJIS:ぁ \x82\x9f
SJIS:ん \x82\xf1
/^(?:\x82[\x9f-\xf1])+$/
なんでできないのか理由家! レベル低いかも知れんけどできるだろ?
0252nobodyさん
04/02/21 22:23ID:???if ($FORM{'name'} !~ /^(\x82[\x9f-\xf1]|\x83[\x40-\x96]|[\x88-\x9f\xe0-\xfc][\x40-\x7e\x80-\xfc])*$/){ &error; }
こんなんでいい?
全角アルファベット数字と記号類も省くけど。
>>250
正しく正規表現書けば、Shift_JISでも処理できるよ。
Perl 5.8.xならencoding.pmがお勧めだけどね。
中の人はUnicodeで処理してるらしいけど。
かぶった?
0253nobodyさん
04/02/21 22:23ID:???・・・
なんかもう、ね。
s/あ/ん/;
と普通にマルチバイト入れてやる場合のこと言ってるんだろ・・・
だれも文字コードでやれなんて言ってない
0255247
04/02/21 22:33ID:???>PerlはEUCじゃないとマルチバイトの処理できない
↑特にこことか。
jperl とか言い出す始末。。。
0256nobodyさん
04/02/21 23:00ID:???いや、いいんだけど、>>248と勝手に争ってくれ。
ここ、過疎スレだから、周り気にしないで争ってね、思う存分
0257nobodyさん
04/02/21 23:20ID:???ありがとうございます。
Shift-Jisで、試してみたところ、
正常動作しているようです。
全角アルファベット数字と記号類も
省きたいと思ってたので助かりました。
0258234
04/02/21 23:44ID:???すまん、意味不明なこと書いちゃった。
MSのWindows ScriptドキュメントでRegExpオブジェクトのヘルプリファレンス読んだんだけど、
RegExp.Execute()のところに、実行するとSubMatchesコレクションが生成されるって記述が
ぜんぜんないんよ。
てなわけで、SubMatchesコレクションの存在を知らなかった……_| ̄|○
(ふだんはBASP21コンポーネントのMatch()やReplace()を使ってるし)
SubMatchesってキーワードでヘルプを調べれば載ってるんだけどね。
0259236
04/02/22 10:53ID:???そういうことっすか。
ちなみにつくるとき、ここを参考にしましたよ。
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnclinic/html/scripting121399.asp
0260nobodyさん
04/02/22 23:25ID:kjGz/T2Cこういう文章から[あたい][とくちょう]の部分を
一括で削除する正規表現を教えてくれないでしょうか。
Wzの検索、置き換えを使っています。
0261nobodyさん
04/02/22 23:39ID:???とかしか思いつかない漏れはここに似つかわしくないですか
0263nobodyさん
04/02/23 10:39ID:???$_[0] = abc\,edf
$_[1] = ghi
という具合に split したいのですが、どうすればよろしいでしょうか?
0264nobodyさん
04/02/23 11:51ID:???split /(?<!\\),/, $str;
以後、Perl の質問は http://pc2.2ch.net/test/read.cgi/php/1075545279/ へ。
0266nobodyさん
04/02/23 20:41ID:Ea0t25blこんなふうに書いてみたけどだめやった。
[^(mojiretu)]
それとも(?!)とか工夫すればできるの?
0267nobodyさん
04/02/23 20:46ID:???0268266
04/02/23 21:30ID:Ea0t25blお願いしまぁす。
0269nobodyさん
04/02/23 22:14ID:???$hoge !~ /^mojiretu/g;
で、文字列以外にヒットするはず
0270nobodyさん
04/02/24 21:18ID:1VWZCh18アルファベットのみで構成される6文字以上10文字以下の文字列、をcygwinのgrepを用いて検索したいのですが…。
正規表現の紹介をしているところを読んで回り、
^「A-Za-z]{6,10}
で、アルファベット6文字以上10文字以下、を表すということが分かったのですが、
grep -i "^[a-z0-9./]{6,9}"
としてみても何も反応が無く、
egrep -i "^[a-z0-9./]{6,9}"
とすると、11文字や12文字の文字列も引っかかってきてしまいます。
どう書けばアルファベットのみで構成される、6文字以上10文字以下の文字列、を正確に検索出来るのでしょうか?
宜しくお願いします。
0271nobodyさん
04/02/24 21:22ID:???egrep -iw "^[a-z0-9./]{6,10}"
途方に暮れて質問させていただいた直後に我に返りました。
wというコマンドを使えば出来ました。
スレ汚し失礼しました…。
0272270
04/02/24 23:35ID:1VWZCh18http://koho.ktplan.jp/tango/y.html
ここを例にして説明します。
上のサイトを開いて、全部選択してテキストにコピペしてy.txtとして保存。
この中から、6文字以上、10文字以下の英単語だけを抜き取ろうとしています。
$ egrep -iw "^[a-z]{6,10}" y.txt
とすると、
English NaviHome0INDEX1 HELP2 Aa Bb Cc Dd Ee Ff Gg Hh Ii Jj Kk Ll Mm Nn Oo Pp Qq
Rr Ss Tt Uu Vv Ww Xx Yy Zz基本的な英単語 Y
yesterday
yourself
Copyright c 2001-2004 English Navi All Rights Reserved
という結果になります。
English NaviHome0INDEX1 HELP2 Aa Bb Cc Dd Ee Ff Gg Hh Ii Jj Kk Ll Mm Nn Oo Pp Qq
Rr Ss Tt Uu Vv Ww Xx Yy Zz基本的な英単語 Y
と
Copyright c 2001-2004 English Navi All Rights Reserved
の部分が、どうしても引っかかってきてしまいます。
上の書き方だと、間にスペースが入っているものとかを排除できないことは分かったのですが、どうすれば目的の文字数の単語だけが抜き出せるのか…頭がパンパンになって来ました。。。
上手く抜き出すことが出来る正規表現の書き方を教えてください。
よろしくお願いします。
0273nobodyさん
04/02/24 23:40ID:???Perlだと
/^[a-z]{6,10}$/i
で、できるかもしれない。
0274270
04/02/24 23:46ID:???即レスありがとうございます…。
$ egrep -iw "^[a-z]{6,10}+$" y.txt
$ egrep "/^[a-z]{6,10}$/i" y.txt
共にだめでした…。
悩んでみます。
0275nobodyさん
04/02/24 23:52ID:???じゃないのかと。
0277nobodyさん
04/02/25 00:19ID:???grepなら{n.m}をサポートしているみたいだが。
0278270
04/02/25 00:22ID:???egrepだと、とりあえず>>272の状態まではたどり着くのですが、
$ grep -iw "^[a-z]{6,10}" y.txt
これだと何も起きないのです…。
そもそもgrepやegrepだと無理…なのかな…。
0279nobodyさん
04/02/25 00:42ID:???$ egrep -iw "^[a-z]{6,10}$" y.txt
yesterday
yourself
$ egrep -V
egrep (GNU grep) 2.4d
0280270
04/02/25 01:07ID:???FreeBSD、ググッテ見ましたが、自分にはよく理解できませんでした。
自分は
http://sources.redhat.com/cygwin/
このcygwinというのを使用しています。
$ egrep -V
egrep (GNU grep) 2.5
と言うことでした。
つまり、これでは出来ない、ということですかね…。
ありがとうございました。
もうちょっとだけ色々考えてみます。
Copyright c 2001-2004 English Navi All Rights Reserved
↑こういうのが引っかかってくるようだと、英文ページから抜き取ることが出来ないですもんね…。
例としたサイトは辞書形式で、単語ごとに改行があったから何とかなったのか…。
0282281
04/02/25 02:28ID:???0283281
04/02/25 02:33ID:???前の [[:space:]]* は余計かも知れないけど。
$ egrep -iw "^[[:space:]]*[a-z]{6,10}[[:space:]]*$" y.txt
0284270
04/02/25 02:48ID:???遅くにスミマセン…調べ調べて、
$ grep "^[a-z0-9./]\{6,10\}" y.txt
これで出来ました…。
本当に出来てるのか、検証していきたいと思います。
$ egrep -iw "^[[:space:]]*[a-z]{6,10}[[:space:]]*$" y.txt
これでも出来ました!まずは…この意味を解読することから勉強して行きたいと思います…。
昨日cygwin入れてみて、初めてgrep使って…頭がパンパンです。・゚・(ノД`)・゚・。
オヤスミナサイ!
0286270
04/02/25 03:34ID:???$ egrep -iw "^[[:space:]]*[a-z]{6,10}[[:space:]]*$" y.txt
どちらを使っても、y.txtの中の改行をすべて空白に変えてみて、一面単語の海にすると取り出せないですね…。
もう諦めてマジ寝ます。
また明日悩みます。
0287281
04/02/25 04:30ID:???それこそ、man egrep して、冒頭を 100遍読んでみ。
ていうか、grep でそれやるなら、
逆に、空白をすべて改行に変えてみた方が取り出しやすいと思われ。
0288nobodyさん
04/02/25 14:02ID:12gYevYJ予約語が行にあったら文字で挟んで置き換えるという処理なんですが
$ReplaceStr = $left . $word . $right;
$line =~ s/(\W)$word(\W)/$1$ReplaceStr$2/g;
だと行頭と行末が正しく置換できないです。どうすればいいんでしょうか?
0289nobodyさん
04/02/25 14:32ID:???0290nobodyさん
04/02/25 17:55ID:12gYevYJありがとうございます!
こんな便利なキャラクタがあったんですね!
それぞれ予約語の配列にforeachかけてやってたんですが
速度的にはこっちの方が速くなるんでしょうか?
chomp(@ReserveWords);
$MachWords = join("|",@ReserveWords);
foreach $line(@inputlines){
$line =~ s/\b$MachWords\b/$left$&$right/g;
}
■ このスレッドは過去ログ倉庫に格納されています