正規表現 part 3
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2006/08/24(木) 19:04:59◆関連サイト
正規表現メモ
http://www.kt.rim.or.jp/~kbk/regex/regex.html
Perl正規表現雑技
http://www.din.or.jp/~ohzaki/regex.htm
Regular Expression(Riue ちゃんの正規表現講座)
http://www.sixnine.net/regexp/
正規表現パズル
http://oraclesqlpuzzle.hp.infoseek.co.jp/regex/
詳説 正規表現
http://www.oreilly.co.jp/books/4873111307/
正規表現プログラミングFAQ
http://capslockabcjp.kitunebi.com/faq.html
JScript 正規表現の概説
http://msdn.microsoft.com/library/ja/script56/html/js56reconIntroductionToRegularExpressions.asp
.NET Framework 正規表現言語要素
http://msdn.microsoft.com/library/ja/cpgenref/html/cpconregularexpressionslanguageelements.asp
◆関連スレ
[UNIX板] 正規表現
http://pc8.2ch.net/test/read.cgi/unix/1039165754/
◆前スレ
[1] http://pc8.2ch.net/test/read.cgi/tech/1062152374/
[2] http://pc8.2ch.net/test/read.cgi/tech/1131028296/
0002デフォルトの名無しさん
2006/08/24(木) 19:06:290003デフォルトの名無しさん
2006/08/24(木) 22:10:05"[A-Za-z0-9]*"でサクッと半角英数字チェックするだけなのに
'a' <= c && c <= 'z'とかで判定する方が10倍速かった。
うーん、スクリプトだから許容できるのが正規表現だとでもいうのか。
0004デフォルトの名無しさん
2006/08/24(木) 22:24:370005デフォルトの名無しさん
2006/08/29(火) 11:35:250006デフォルトの名無しさん
2006/09/09(土) 17:31:20まあそんなもんだわさ
0007デフォルトの名無しさん
2006/09/12(火) 00:58:150008デフォルトの名無しさん
2006/09/13(水) 00:09:49インフォ正規
インフォ精液
0009デフォルトの名無しさん
2006/09/13(水) 13:51:04という文字列から
変数aに111を、変数bに222を
格納するようにするにはどうしたらいいですか
0010デフォルトの名無しさん
2006/09/13(水) 13:55:11a = $&
でaに111は格納できたんですが
222も見るにはどうしたらいいですか
0011デフォルトの名無しさん
2006/09/13(水) 14:02:05Ruby なら scan を使うと文字列を逐次正規表現マッチできて便利だよ。
"aaa111bbb222".scan(/([a-z]+)(\d+)/).each { |key, val|
p [key, val]
}
ブロックの中は適当に料理してちょ。
0012デフォルトの名無しさん
2006/09/13(水) 14:15:26a = Array.new
"aaa111bbb333".scan(/\d+/).each{|tmp|
a << tmp
}
てな感じで解決しました。ありがとうございました。
0013デフォルトの名無しさん
2006/09/13(水) 14:23:210014デフォルトの名無しさん
2006/09/14(木) 05:46:090015デフォルトの名無しさん
2006/09/14(木) 10:14:560016デフォルトの名無しさん
2006/09/14(木) 12:07:26って言われたらどっちを選びますか?
0017デフォルトの名無しさん
2006/09/14(木) 12:11:110018デフォルトの名無しさん
2006/09/14(木) 13:06:04jul08,jun01のように前に0を入れたいのですが
これを正規表現で実現しようとすると
数字と文字を別々にマッチさせて
$10$2のように書くと、$10と解釈されてしまいます
エスケープは置換文字列では使えないようなんですが
何か良い方法はあるでしょうか?
0019デフォルトの名無しさん
2006/09/14(木) 13:08:080020デフォルトの名無しさん
2006/09/14(木) 13:18:27勘で "${1}0${2}" とか。
0021デフォルトの名無しさん
2006/09/14(木) 16:31:08ttp://ukiya.sakura.ne.jp/
0022デフォルトの名無しさん
2006/09/14(木) 17:49:04正規表現テスターをとりあえずダウンロードした。
0023デフォルトの名無しさん
2006/09/14(木) 19:19:360024デフォルトの名無しさん
2006/09/14(木) 19:21:580025デフォルトの名無しさん
2006/09/14(木) 20:22:33jul08,jun01
がまざってたら
jul008,jun001
ができる
0026デフォルトの名無しさん
2006/09/14(木) 20:33:36んなこたあない。
s/([a-z]+)(\d)\b/${1}0$2/g;
0027デフォルトの名無しさん
2006/09/15(金) 00:41:30>>25
>>26
なるほど、自分の勉強不足でした。
{
0028デフォルトの名無しさん
2006/09/15(金) 01:13:44TextMateというエディタから用いて変換していました。
日本語マニュアルがないため、置換文字列でどんな構文
があるかきちんと調べた事がなかったですが、今回気になって
調べてみると(?1:$1)0$2という置換文字列でうまくいきました。
Perlのやり方も凄く勉強になりました。
お騒がせしてすいません。
0029デフォルトの名無しさん
2006/09/15(金) 06:52:330030デフォルトの名無しさん
2006/09/18(月) 00:12:48《.*》
だと
朝の|挨《あい》|拶《さつ》を
が
朝の|挨が
になっちゃうわけです。同一行に《が二つ以上現れなきゃいいんだけれども
実際現れるから困る。知恵を貸して欲しい
0031デフォルトの名無しさん
2006/09/18(月) 00:15:28s/《.*?》//g;
「perl 最短一致」でググれ。
0032デフォルトの名無しさん
2006/09/18(月) 00:25:230033デフォルトの名無しさん
2006/09/18(月) 18:29:26マッチささたいのですがどうしたらいいですか?
0034デフォルトの名無しさん
2006/09/18(月) 20:01:130035デフォルトの名無しさん
2006/09/18(月) 20:27:32勿論 !/^ / とはマッチするものが違う
0036デフォルトの名無しさん
2006/09/18(月) 20:29:29Perlなら、
$str !~ /^ /
じゃダメなの?
0037デフォルトの名無しさん
2006/09/18(月) 21:12:42それだと空行や1個や2個しか文字が無い行もマッチするけどね。
0038デフォルトの名無しさん
2006/09/21(木) 00:03:58この正規表現は、二つ以上の連続した改行文字(\n)にマッチしますが
\n と \nの間にいくつかの空白文字(半角スペース, タブ)がある場合にマッチする表現がわかりません。
一応「 [\n](|[\s]*)[\n] 」と書いてみたものの、思うようにマッチしません。
どう表現すればよいのでしょうか? よろしくおねがいします。
0039デフォルトの名無しさん
2006/09/21(木) 02:26:10で、何を使ってでそれをやろうとしているの?
\s とかあるからPerlかな?
マッチングに使っている部分全部さらしてみ。
0040デフォルトの名無しさん
2006/09/21(木) 02:38:33正規表現勉強しなおせ
/\n\s+?\n/
0041デフォルトの名無しさん
2006/09/21(木) 03:41:31004338
2006/09/21(木) 20:50:34PHPのpreg()系です。
HTMLの<textarea>から</textare>に入力された文字から、連続した改行(=空行=)を取り除こうと思ったのです。
ただ、空行ではないけれど、改行と改行の間にスペース(タブも含む)がある行も取り除きたいのです。
これはどう表現すればよいのでしょうか?
当然ですがtextarea要素の内容は、全体を一つの文字列として扱うので「 ^$ 」という表現はダメでした。
0044デフォルトの名無しさん
2006/09/21(木) 21:47:37Rubyならhtmlパーサがあるから簡単に処理できるのだがな。
0045デフォルトの名無しさん
2006/09/21(木) 23:00:15> PHPのpreg()系です。
先に言えよ、ヴォケ!
$html = preg_replace_callback('{(?<=<textarea>)(.+?)(?=</textarea>)}si',
create_function('$matches',
'return preg_replace("/(?<=\\n)\\s*\\n/", "", $matches[0]);'), $html);
0046デフォルトの名無しさん
2006/09/21(木) 23:11:480048デフォルトの名無しさん
2006/09/22(金) 00:07:15そんなときは、一度でやろうとせずに
まず
「空白のみを含む行を削除」してから
「連続する改行を1改行に置換」するといいかもね。
0049デフォルトの名無しさん
2006/09/22(金) 00:23:27正規表現勉強しなおせw
0050デフォルトの名無しさん
2006/09/22(金) 00:24:19@abc.gr.jp と @wxy-z.co.jp
以外のアドレスを拒否する場合
どうしたらいいでしょうか。
0052デフォルトの名無しさん
2006/09/22(金) 01:59:16ただのpreg_replaceでこんな感じでいけるだろ
/(^|\n)\s*(?:\n)/
あっちのスレで話題になってた各ブラウザの挙動がどうのは知らん
0053デフォルトの名無しさん
2006/09/23(土) 08:29:03&gt; から &lt; に含まれる <br> のみ全て削除するにはどうすればいいでしょう?
$str =~ s/&lt;(.*?)<br>(.*?)&gt;/&lt;$1$2&gt;/g;
でやってみたのですが、<br>が複数ある場合ひとつしか削除できません。
いろいろ調べたんですが行き詰りました。
低レベルな質問かもしれませんがお願いします。
(文中の&は全角ですが実際は半角でやってます。)
0054デフォルトの名無しさん
2006/09/23(土) 09:05:05my ($tmp) = @_;
$tmp =~ s/<br>//g;
return $tmp;
}
を用意した上で
s/&gt;(.*?)&lt;/delbr($&)/ge;
0055デフォルトの名無しさん
2006/09/23(土) 17:59:43正規表現だけで、Not条件を加えるのは無理なんでしょうか?
http://www.kt.rim.or.jp/~kbk/regex/regex.html#CCLASS
にあるような、よくある勘違いの例と同じなのですが、
ここで言うと[^foo]が"foo"以外では無く、fとo以外の一文字をあらわすのはわかります。
でも、それではその"foo"を全体を含まない文字列というのを
表現(追加)したい場合はどうすればいいんでしょうか?
"|"でorが出来るみたいにnotできたら簡単確実なのに、うまく除外するのに毎回頭を絞ってます。
検索等フロントエンドの実装で、否定条件指定のフィルタリングがある場合ならいいんですが…
例えば[^(giko|mike)]nekoみたいな感じで、簡単に文字列や正規表現全体を
否定(〜以外)できたらなにかと便利だと思うのですが、
それは正規表現の範疇外なのでしょうか?
うまくやる方法はありますか?
0056デフォルトの名無しさん
2006/09/23(土) 18:26:40こうですか!? わかりません!
…原理はわからないが環境によっては動くな。おいおい勉強しまつorz
0057デフォルトの名無しさん
2006/09/23(土) 18:39:05すごい便利。
Rex V: an AJAX Regular EXpression eValuator
http://www.rexv.org/
0058デフォルトの名無しさん
2006/09/23(土) 18:46:54何を何でやりたいのかはっきり書かないからレスがない。
0059デフォルトの名無しさん
2006/09/24(日) 00:18:490060デフォルトの名無しさん
2006/09/24(日) 10:55:50\b(?:(?!giko|mike)\w)+neko
とか、どうですか。
0061デフォルトの名無しさん
2006/09/24(日) 11:06:490062デフォルトの名無しさん
2006/09/24(日) 11:36:40おまえのアヌスになど興味はない
0063デフォルトの名無しさん
2006/09/24(日) 20:50:080064デフォルトの名無しさん
2006/09/24(日) 22:59:480065デフォルトの名無しさん
2006/09/24(日) 23:18:17ξ←ソフトクリーム
MS Pゴシックで見てね1
0066デフォルトの名無しさん
2006/09/25(月) 00:05:06(´∀` )
(⊃⌒*⌒⊂)
/__ノ''''ヽ__)
0067デフォルトの名無しさん
2006/09/25(月) 20:11:30のようなリンクを
<a href='http://hoge/page'>javascript:window.open</a><br>
にするには
Obj.href.replace(/JavaScript:window.open\((\"?|\'?)(.*?)(\"?|\'?),?.*\);?(.*);?/ig,'$2')
ではうまくいきません。
よろしくお願いします。
0068デフォルトの名無しさん
2006/09/25(月) 20:24:200069デフォルトの名無しさん
2006/09/26(火) 18:09:05置き換えるのは空白一文字ではなく、コメントになっている文字分空白にしたいです
0070デフォルトの名無しさん
2006/09/26(火) 23:01:46$pat='>(.*?)</c>';
if($text=~/$pat/) {
print $1."\n";
}
else {
print "ng\n";
}
AIUEOのみ抽出したいのですが、</b>AIUEOが返ってきます。
.*?は最短マッチのはずですが、なぜでしょうか?
0071デフォルトの名無しさん
2006/09/26(火) 23:29:57こういう例を考えると正規表現よりCでコード書いた方が早いと思うよ
printf("string//string"); // print
>>70
Perlでは一度成功したらそれでマッチが完了する
最短なのは .* に関してのみ
>([^<>]*)</c>
で望みのマッチをする
0072デフォルトの名無しさん
2006/09/26(火) 23:39:31007370
2006/09/27(水) 00:12:15>Perlでは一度成功したらそれでマッチが完了する
これは前方から順に一致検索をしているとから、ということですか?
たとえば、
$text='</b></b>AIUEO</c></c>';
$pat='</b>(.*?)</c>';
の場合、$textの先頭側にある</b>と</c>に挟まれた文字列が抽出されてくるから、</b>AIUEOがマッチ。
もし後方から一致検索されていれば、AIUEO</c>がマッチするはずですもんね。
スマートな方法がなさそうなので([^<>]*)にしときます。
ありがとうございました。
>>72no
0074デフォルトの名無しさん
2006/09/27(水) 12:03:56BEGIN {
$COMMENT = qr{/\*.*?\*/};
$COMMENT2 = qr{//[^\n]*};
$DOUBLE = qr{\".*?[^\\]\"};
$SINGLE = qr{\'.*?[^\\]\'};
$OTHER = qr{[^"'/]};
}
s/($DOUBLE|$SINGLE|$OTHER+)|$COMMENT|$COMMENT2/$1/g;
詳説 正規表現がどっかにいってしまった
添削希望
0075デフォルトの名無しさん
2006/09/27(水) 12:10:090076デフォルトの名無しさん
2006/09/27(水) 20:30:05速度はともかく開発効率がいいから、
決められたライブラリしか使えないときに便利なんだよね
0077デフォルトの名無しさん
2006/09/27(水) 23:51:17意外とシンプルにまとまるんだね
リテラルで"string\\"のパターンが来ると内外逆転するかな
やり方はいろいろあるけど qr{"(\\.|[^"])*"} とか
0078デフォルトの名無しさん
2006/09/28(木) 00:21:03GUIコンポーネントの入力チェックに使ったことはあるな
ああいうのは手でコーディングするのは苦痛なだけだから。
あと、入力チェックが必要になるようなGUIコンポーネントの場合、
入力は一般的に短いので、速度は問題にならないし
0079デフォルトの名無しさん
2006/09/28(木) 07:56:20<aaa>
<aaa>
<aaa>
<aaa>
<data1>xxxx</data1>
<data2>yyyy</data2>
</aaa>
</aaa>
</aaa>
</aaa>
こんな文字列があったとして
正規表現つかって一発で一番内側にある<aaa>
の内側の文字を取ってくることってできるんだろうか・・・・
可能か不可能かどうかも想像がつかない・・・orz
0080デフォルトの名無しさん
2006/09/28(木) 09:04:06できる。
0081デフォルトの名無しさん
2006/09/28(木) 09:23:50横からスマソ
へぇ〜
出来るんだ
これは俺もちょっと興味深い
0082デフォルトの名無しさん
2006/09/28(木) 12:00:380083デフォルトの名無しさん
2006/09/28(木) 15:40:04最初からXMLとして扱ったほうが楽なんじゃないの?
0084デフォルトの名無しさん
2006/09/28(木) 18:50:490085デフォルトの名無しさん
2006/09/28(木) 19:22:59入れ子処理だよね。正規表現第二版だと…
( )の入れ子の場合こうなっているから、
$LevelN = qr/ (?> [^()]+ | \( ??{ $LevelN }) \) )*/x;
えーと………
$LevelN = qr/ (?> [^(<aaa>|<\/aaa>)]+ | <aaa> (??{ $LevelN }) <\/aaa> )*/x;
……(<aaa>|<\/aaa>)の否定ってどうやるんだ?
後は任せた orz
0086デフォルトの名無しさん
2006/09/28(木) 20:12:05いや、今の「正規表現」が厳密には正規表現じゃないのは知ってるけど、やっぱり
無理やり拡張したため、無理が出てると思うんだ
0087デフォルトの名無しさん
2006/09/29(金) 00:07:24/(<aaa>)*(.*?)<\/aaa>/
0088デフォルトの名無しさん
2006/09/29(金) 01:50:24(<aaa>.*)*<aaa>(.*?)<\/aaa>
Perlなら、(<aaa>.*?)*<aaa>(.*?)<\/aaa>
でもイケた。
0089デフォルトの名無しさん
2006/09/29(金) 04:41:56Perlなら、{(?:<aaa>.*?)*<aaa>(.*?)</aaa>}m
0090デフォルトの名無しさん
2006/09/29(金) 10:15:222. End Function
3. Exit Function
上記で1だけを検索したい場合どうすればいいでしょうか?
↓ではだめでした
(?<!(Exit|End))\s*Function
0091デフォルトの名無しさん
2006/09/29(金) 10:20:41^Function$
でいいんじゃね?
0092デフォルトの名無しさん
2006/09/29(金) 10:39:03トンクス!
もらった情報でなんとかなったさ〜!
ソフトでガリガリ解析するのがたまらなかったんで・・・
ちなみにXML解析じゃぁないんだけどね(^^;
俺ももっと勉強しなきゃ・・・だなぁ(;´Д`)
もっと頭やわらかくする必要がありそうだorz
0093デフォルトの名無しさん
2006/09/29(金) 10:43:36(?:^|[^dt\s]|(?:^|[^n]|(?:^|[^E])n)d|(?:^|[^i]|(?:^|[^x]|(?:^|[^E])x)i)t)\s*Function
オレならFunctionでマッチさせてマッチ位置もらってからEndかExitが前に
ないことを別途調べるな。否定と正規表現は相性悪い。
0094デフォルトの名無しさん
2006/09/29(金) 10:45:470095デフォルトの名無しさん
2006/09/29(金) 11:06:530096デフォルトの名無しさん
2006/09/30(土) 02:44:00俺も同じこと思った。あと、XMLだとそもそも既存のパーサがあるのに
何故それを使わないで正規表現で済まそうとするのかと。あと、ある要素
取り出すだけなら、>>95の書いているようにXPath使う手もあるな
0097デフォルトの名無しさん
2006/09/30(土) 06:37:14色んな検索エンジンや仕様があって把握しきれません
まとめたサイトみたいなものはありませんか
0098デフォルトの名無しさん
2006/09/30(土) 11:41:39>>1
何のためのテンプレよ。
0099デフォルトの名無しさん
2006/09/30(土) 13:37:17(?{ code })
Perlにおいて、埋め込まれたPerlコードを実行します
(??{ code })
Perlにおいて、埋め込まれたPerlコードを実行してその結果を正規表現を表すものとして使用
ができる、windows用の置換ツールってありますか?
0100デフォルトの名無しさん
2006/09/30(土) 14:03:110101デフォルトの名無しさん
2006/09/30(土) 14:08:17Perl
■ このスレッドは過去ログ倉庫に格納されています