トップページ⇒tech
984コメント279KB

正規表現 part 3

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2006/08/24(木) 19:04:59
正規表現(Regular Expression)スレです。

◆関連サイト
正規表現メモ
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:29
とりあえずまだpart2が埋まってない
0003デフォルトの名無しさん2006/08/24(木) 22:10:05
Javaで文字列属性チェックに使ったら糞重かった。
"[A-Za-z0-9]*"でサクッと半角英数字チェックするだけなのに
'a' <= c && c <= 'z'とかで判定する方が10倍速かった。

うーん、スクリプトだから許容できるのが正規表現だとでもいうのか。
0004デフォルトの名無しさん2006/08/24(木) 22:24:37
もっと複雑な場合こそが正規表現の使いどころ。
0005デフォルトの名無しさん2006/08/29(火) 11:35:25
/.*/
0006デフォルトの名無しさん2006/09/09(土) 17:31:20
>>3
まあそんなもんだわさ
0007デフォルトの名無しさん2006/09/12(火) 00:58:15
前スレは1000盗り合戦会場
0008デフォルトの名無しさん2006/09/13(水) 00:09:49
infoseek
インフォ正規
インフォ精液
0009デフォルトの名無しさん2006/09/13(水) 13:51:04
aaa111bbb222
という文字列から
変数aに111を、変数bに222を
格納するようにするにはどうしたらいいですか
0010デフォルトの名無しさん2006/09/13(水) 13:55:11
"aaa111bbb222" =~ /\d+/
a = $&
でaに111は格納できたんですが
222も見るにはどうしたらいいですか
0011デフォルトの名無しさん2006/09/13(水) 14:02:05
>>10
Ruby なら scan を使うと文字列を逐次正規表現マッチできて便利だよ。

"aaa111bbb222".scan(/([a-z]+)(\d+)/).each { |key, val|
p [key, val]
}

ブロックの中は適当に料理してちょ。
0012デフォルトの名無しさん2006/09/13(水) 14:15:26
ありがとうございました。
a = Array.new
"aaa111bbb333".scan(/\d+/).each{|tmp|
a << tmp
}
てな感じで解決しました。ありがとうございました。
0013デフォルトの名無しさん2006/09/13(水) 14:23:21
a = "aaa111bbb333".scan(/\d+/)
0014デフォルトの名無しさん2006/09/14(木) 05:46:09
なんかスクレイピングとかリライトっぽい質問ばかりだな
0015デフォルトの名無しさん2006/09/14(木) 10:14:56
それ以外の質問をしなくては何か都合が悪いことでもおありで?
0016デフォルトの名無しさん2006/09/14(木) 12:07:26
わたしと正規表現とどっちが大事なの?

って言われたらどっちを選びますか?
0017デフォルトの名無しさん2006/09/14(木) 12:11:11
性器を選びます。
0018デフォルトの名無しさん2006/09/14(木) 13:06:04
jul8,jun1というような日付を
jul08,jun01のように前に0を入れたいのですが
これを正規表現で実現しようとすると
数字と文字を別々にマッチさせて
$10$2のように書くと、$10と解釈されてしまいます
エスケープは置換文字列では使えないようなんですが
何か良い方法はあるでしょうか?
0019デフォルトの名無しさん2006/09/14(木) 13:08:08
 
0020デフォルトの名無しさん2006/09/14(木) 13:18:27
実装言語は何かを言ってくれないと的確な回答はできないと思うのだが、
勘で "${1}0${2}" とか。
0021デフォルトの名無しさん2006/09/14(木) 16:31:08
最近みつけたけど、ここ、まあまあわかりやすい

ttp://ukiya.sakura.ne.jp/
0022デフォルトの名無しさん2006/09/14(木) 17:49:04
>>21
正規表現テスターをとりあえずダウンロードした。
0023デフォルトの名無しさん2006/09/14(木) 19:19:36
(?:$1)0$2
0024デフォルトの名無しさん2006/09/14(木) 19:21:58
>>23は勘違いです(´・ω・`)
0025デフォルトの名無しさん2006/09/14(木) 20:22:33
もともと
jul08,jun01
がまざってたら
jul008,jun001
ができる
0026デフォルトの名無しさん2006/09/14(木) 20:33:36
>>25
んなこたあない。
s/([a-z]+)(\d)\b/${1}0$2/g;
0027デフォルトの名無しさん2006/09/15(金) 00:41:30
>>20
>>25
>>26
なるほど、自分の勉強不足でした。
{
0028デフォルトの名無しさん2006/09/15(金) 01:13:44
Ruby互換のOnigurumaという正規表現エンジンを
TextMateというエディタから用いて変換していました。
日本語マニュアルがないため、置換文字列でどんな構文
があるかきちんと調べた事がなかったですが、今回気になって
調べてみると(?1:$1)0$2という置換文字列でうまくいきました。
Perlのやり方も凄く勉強になりました。
お騒がせしてすいません。
0029デフォルトの名無しさん2006/09/15(金) 06:52:33
$1\x30$2 なんて方法もある。
0030デフォルトの名無しさん2006/09/18(月) 00:12:48
青空文庫のルビを消したいのだが
《.*》
だと
朝の|挨《あい》|拶《さつ》を
が
朝の|挨が
になっちゃうわけです。同一行に《が二つ以上現れなきゃいいんだけれども
実際現れるから困る。知恵を貸して欲しい
0031デフォルトの名無しさん2006/09/18(月) 00:15:28
>>30
s/《.*?》//g;
「perl 最短一致」でググれ。
0032デフォルトの名無しさん2006/09/18(月) 00:25:23
サンクス!なるへそね。恩にきる
0033デフォルトの名無しさん2006/09/18(月) 18:29:26
行頭の1〜3文字目にスペース以外の文字がある行を
マッチささたいのですがどうしたらいいですか?
0034デフォルトの名無しさん2006/09/18(月) 20:01:13
/^([^ ]| [^]| [^ ])/とか、perlでif (/^.../ && $& =~ /[^ ]/)とか。
0035デフォルトの名無しさん2006/09/18(月) 20:27:32
/^.{0,2}[^ ]/
勿論 !/^ / とはマッチするものが違う
0036デフォルトの名無しさん2006/09/18(月) 20:29:29
>>33
Perlなら、

$str !~ /^   /

じゃダメなの?
0037デフォルトの名無しさん2006/09/18(月) 21:12:42
>>36
それだと空行や1個や2個しか文字が無い行もマッチするけどね。
0038デフォルトの名無しさん2006/09/21(木) 00:03:58
[\n][\n]*
この正規表現は、二つ以上の連続した改行文字(\n)にマッチしますが
\n と \nの間にいくつかの空白文字(半角スペース, タブ)がある場合にマッチする表現がわかりません。

一応「 [\n](|[\s]*)[\n] 」と書いてみたものの、思うようにマッチしません。
どう表現すればよいのでしょうか? よろしくおねがいします。
0039デフォルトの名無しさん2006/09/21(木) 02:26:10
>>38

で、何を使ってでそれをやろうとしているの?
\s とかあるからPerlかな?

マッチングに使っている部分全部さらしてみ。
0040デフォルトの名無しさん2006/09/21(木) 02:38:33
>>38
正規表現勉強しなおせ


/\n\s+?\n/
0041デフォルトの名無しさん2006/09/21(木) 03:41:31
オマエモナーw
0042 ◆TWARamEjuA 2006/09/21(木) 19:15:26
s
0043382006/09/21(木) 20:50:34
>>39
PHPのpreg()系です。

HTMLの<textarea>から</textare>に入力された文字から、連続した改行(=空行=)を取り除こうと思ったのです。
ただ、空行ではないけれど、改行と改行の間にスペース(タブも含む)がある行も取り除きたいのです。

これはどう表現すればよいのでしょうか?
当然ですがtextarea要素の内容は、全体を一つの文字列として扱うので「 ^$ 」という表現はダメでした。
0044デフォルトの名無しさん2006/09/21(木) 21:47:37
>>43
Rubyならhtmlパーサがあるから簡単に処理できるのだがな。
0045デフォルトの名無しさん2006/09/21(木) 23:00:15
>>43
> 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:48
題は空行削除であって、textatraタグは無関係でしょ
0047452006/09/21(木) 23:43:23
>>46
ん?空行削除されてない?
0048デフォルトの名無しさん2006/09/22(金) 00:07:15
>>43
そんなときは、一度でやろうとせずに
まず 
「空白のみを含む行を削除」してから
「連続する改行を1改行に置換」するといいかもね。
0049デフォルトの名無しさん2006/09/22(金) 00:23:27
>>45
正規表現勉強しなおせw
0050デフォルトの名無しさん2006/09/22(金) 00:24:19
phpのeregで
@abc.gr.jp と @wxy-z.co.jp
以外のアドレスを拒否する場合
どうしたらいいでしょうか。
0051452006/09/22(金) 00:47:13
>>49
コード出して指摘してくださいよ。
0052デフォルトの名無しさん2006/09/22(金) 01:59:16
>>43
ただのpreg_replaceでこんな感じでいけるだろ

/(^|\n)\s*(?:\n)/

あっちのスレで話題になってた各ブラウザの挙動がどうのは知らん
0053デフォルトの名無しさん2006/09/23(土) 08:29:03
Perlで、
 &gt; から &lt; に含まれる <br> のみ全て削除するにはどうすればいいでしょう?

$str =~ s/&lt;(.*?)<br>(.*?)&gt;/&lt;$1$2&gt;/g;
でやってみたのですが、<br>が複数ある場合ひとつしか削除できません。
いろいろ調べたんですが行き詰りました。
低レベルな質問かもしれませんがお願いします。
(文中の&は全角ですが実際は半角でやってます。)
0054デフォルトの名無しさん2006/09/23(土) 09:05:05
sub delbr {
my ($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
(?!giko)(?!mike)(?=neko)
こうですか!? わかりません!

…原理はわからないが環境によっては動くな。おいおい勉強しまつorz
0057デフォルトの名無しさん2006/09/23(土) 18:39:05
AJAXでリアルタイムに正規表現チェックできるサイト
すごい便利。

Rex V: an AJAX Regular EXpression eValuator
http://www.rexv.org/

0058デフォルトの名無しさん2006/09/23(土) 18:46:54
>>55-56
何を何でやりたいのかはっきり書かないからレスがない。
0059デフォルトの名無しさん2006/09/24(日) 00:18:49
[^(foo)]
0060デフォルトの名無しさん2006/09/24(日) 10:55:50
>55

\b(?:(?!giko|mike)\w)+neko

とか、どうですか。
0061デフォルトの名無しさん2006/09/24(日) 11:06:49
([あ-ん]|あっ)*
0062デフォルトの名無しさん2006/09/24(日) 11:36:40
>>61
おまえのアヌスになど興味はない
0063デフォルトの名無しさん2006/09/24(日) 20:50:08
ワロタ
0064デフォルトの名無しさん2006/09/24(日) 22:59:48
* ←アナル
0065デフォルトの名無しさん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='javascript:window.open("http://hoge/page";,"f","width=460,height=400");void(0);'>javascript:window.open</a><br>
のようなリンクを
<a href='http://hoge/page'>;javascript:window.open</a><br>
にするには
Obj.href.replace(/JavaScript:window.open\((\"?|\'?)(.*?)(\"?|\'?),?.*\);?(.*);?/ig,'$2')
ではうまくいきません。
よろしくお願いします。
0068デフォルトの名無しさん2006/09/25(月) 20:24:20
age
0069デフォルトの名無しさん2006/09/26(火) 18:09:05
Cソース中の2つのコメントの、「//・・・」と「/*・・・・・*/」を、空白に置き換えることは可能ですか?
置き換えるのは空白一文字ではなく、コメントになっている文字分空白にしたいです
0070デフォルトの名無しさん2006/09/26(火) 23:01:46
$text='</a></b>AIUEO</c>';
$pat='>(.*?)</c>';
if($text=~/$pat/) {
 print $1."\n";
}
else {
 print "ng\n";
}

AIUEOのみ抽出したいのですが、</b>AIUEOが返ってきます。
.*?は最短マッチのはずですが、なぜでしょうか?
0071デフォルトの名無しさん2006/09/26(火) 23:29:57
>>69
こういう例を考えると正規表現よりCでコード書いた方が早いと思うよ
printf("string//string"); // print

>>70
Perlでは一度成功したらそれでマッチが完了する
最短なのは .* に関してのみ
>([^<>]*)</c>
で望みのマッチをする
0072デフォルトの名無しさん2006/09/26(火) 23:39:31
>>70 おまえもしかして、あき?
0073702006/09/27(水) 00:12:15
>>71
>Perlでは一度成功したらそれでマッチが完了する
これは前方から順に一致検索をしているとから、ということですか?
たとえば、
$text='</b></b>AIUEO</c></c>';
$pat='</b>(.*?)</c>';
の場合、$textの先頭側にある</b>と</c>に挟まれた文字列が抽出されてくるから、</b>AIUEOがマッチ。
もし後方から一致検索されていれば、AIUEO</c>がマッチするはずですもんね。

スマートな方法がなさそうなので([^<>]*)にしときます。
ありがとうございました。

>>72no
0074デフォルトの名無しさん2006/09/27(水) 12:03:56
#!/usr/bin/perl -p0777
BEGIN {
$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:09
コメントを除去したいならプリプロセッサに通せば良いと思うんだ
0076デフォルトの名無しさん2006/09/27(水) 20:30:05
Javaで正規表現を入力チェックに使ってる人って居る?
速度はともかく開発効率がいいから、
決められたライブラリしか使えないときに便利なんだよね
0077デフォルトの名無しさん2006/09/27(水) 23:51:17
>>74
意外とシンプルにまとまるんだね
リテラルで"string\\"のパターンが来ると内外逆転するかな
やり方はいろいろあるけど qr{"(\\.|[^"])*"} とか
0078デフォルトの名無しさん2006/09/28(木) 00:21:03
>>76
GUIコンポーネントの入力チェックに使ったことはあるな
ああいうのは手でコーディングするのは苦痛なだけだから。
あと、入力チェックが必要になるような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
>>79
できる。
0081デフォルトの名無しさん2006/09/28(木) 09:23:50
>>80
横からスマソ
へぇ〜
出来るんだ
これは俺もちょっと興味深い
0082デフォルトの名無しさん2006/09/28(木) 12:00:38
<aaa>(?!<aaa>)(.*?)</aaa>
0083デフォルトの名無しさん2006/09/28(木) 15:40:04
XMLを無理やり正規表現で扱うくらいなら
最初からXMLとして扱ったほうが楽なんじゃないの?
0084デフォルトの名無しさん2006/09/28(木) 18:50:49
長さ優先じゃなくて出現優先にすりゃいいだけだね
0085デフォルトの名無しさん2006/09/28(木) 19:22:59
>>80
入れ子処理だよね。正規表現第二版だと…

( )の入れ子の場合こうなっているから、
$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:56
>Perlなら、(<aaa>.*?)*<aaa>(.*?)<\/aaa>
Perlなら、{(?:<aaa>.*?)*<aaa>(.*?)</aaa>}m
0090デフォルトの名無しさん2006/09/29(金) 10:15:22
1. Function
2. End Function
3. Exit Function
上記で1だけを検索したい場合どうすればいいでしょうか?

↓ではだめでした
 (?<!(Exit|End))\s*Function

0091デフォルトの名無しさん2006/09/29(金) 10:20:41
>>90
^Function$
でいいんじゃね?
0092デフォルトの名無しさん2006/09/29(金) 10:39:03
>>80->>89
トンクス!
もらった情報でなんとかなったさ〜!
ソフトでガリガリ解析するのがたまらなかったんで・・・

ちなみにXML解析じゃぁないんだけどね(^^;
俺ももっと勉強しなきゃ・・・だなぁ(;´Д`)

もっと頭やわらかくする必要がありそうだorz
0093デフォルトの名無しさん2006/09/29(金) 10:43:36
>>90
(?:^|[^dt\s]|(?:^|[^n]|(?:^|[^E])n)d|(?:^|[^i]|(?:^|[^x]|(?:^|[^E])x)i)t)\s*Function

オレならFunctionでマッチさせてマッチ位置もらってからEndかExitが前に
ないことを別途調べるな。否定と正規表現は相性悪い。

0094デフォルトの名無しさん2006/09/29(金) 10:45:47
パーサ書いた方が実装容易で見通しも保守性も拡張性もあって良いような気がする漏れは失格ですかそうですか。
0095デフォルトの名無しさん2006/09/29(金) 11:06:53
タグ系はXPathでええやん
0096デフォルトの名無しさん2006/09/30(土) 02:44:00
>>94
俺も同じこと思った。あと、XMLだとそもそも既存のパーサがあるのに
何故それを使わないで正規表現で済まそうとするのかと。あと、ある要素
取り出すだけなら、>>95の書いているようにXPath使う手もあるな
0097デフォルトの名無しさん2006/09/30(土) 06:37:14
アクセスログから検索ワードを抽出するのを試みたいんだけど、
色んな検索エンジンや仕様があって把握しきれません
まとめたサイトみたいなものはありませんか
0098デフォルトの名無しさん2006/09/30(土) 11:41:39
>>97
>>1

何のためのテンプレよ。
0099デフォルトの名無しさん2006/09/30(土) 13:37:17
perlの
(?{ code })
Perlにおいて、埋め込まれたPerlコードを実行します
(??{ code })
Perlにおいて、埋め込まれたPerlコードを実行してその結果を正規表現を表すものとして使用
ができる、windows用の置換ツールってありますか?
0100デフォルトの名無しさん2006/09/30(土) 14:03:11
何に使うの?
0101デフォルトの名無しさん2006/09/30(土) 14:08:17
>>99
Perl
■ このスレッドは過去ログ倉庫に格納されています