正規表現 part2
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2005/11/03(木) 23:31:36関連スレ
UNIX板 正規表現
http://pc8.2ch.net/test/read.cgi/unix/1039165754/
プログラマー板 【Regular】正規表現【Expression】
http://pc8.2ch.net/test/read.cgi/prog/1126622479/
WebProg板 正規表現道場@2ch Part4
http://pc8.2ch.net/test/read.cgi/php/1105930285/
前スレ
http://pc8.2ch.net/test/read.cgi/tech/1062152374/
0002デフォルトの名無しさん
2005/11/03(木) 23:32:45つーか1誌ね
0003デフォルトの名無しさん
2005/11/03(木) 23:38:26性器表現 part2
http://pc8.2ch.net/test/read.cgi/tech/1131027222/
0004デフォルトの名無しさん
2005/11/03(木) 23:38:27性器表現 part2
http://pc8.2ch.net/test/read.cgi/tech/1131027222/
0005デフォルトの名無しさん
2005/11/03(木) 23:38:52重複してるのか?
0006デフォルトの名無しさん
2005/11/03(木) 23:41:16>http://pc8.2ch.net/test/read.cgi/tech/1131027222/
↑の方を削除依頼すればいいのでは?
0007デフォルトの名無しさん
2005/11/04(金) 00:03:130008デフォルトの名無しさん
2005/11/04(金) 00:11:130009デフォルトの名無しさん
2005/11/04(金) 02:48:530010デフォルトの名無しさん
2005/11/04(金) 13:53:130011デフォルトの名無しさん
2005/11/04(金) 14:34:01数字が 0 と正の整数だとして。
・(0|1|2|3ry
・([0-9]|[1-9][0-9]|1[0-9][0-9]|2([0-4][0-9]|5[0-5]))
・0 <= x && x <= 255
001210
2005/11/04(金) 15:47:07(2([0-4][0-9]|5[0-5])|1[0-9][0-9]|[1-9][0-9]|[0-9])
というように逆にしないとうまくいかないようです。
それは置いとくとして、これだと
2560 がヒットしてしまうのですよ
0013デフォルトの名無しさん
2005/11/04(金) 16:07:56言語は? Perl なら (?:1\d?\d?|2(?:5[0-5]?|[0-4]?\d?)|[3-9]\d?|0)
001410
2005/11/04(金) 16:20:22言語は何でもいいよ。phpでも秀丸マクロでも。
逆にいえば、どの言語でもそこそこ動くよう
一般的?なパターン構文のみを使った
正規表現がいいな
0015デフォルトの名無しさん
2005/11/04(金) 16:37:15頭と尻に[^0-9]付ければ良いだけちゃうの?
0016デフォルトの名無しさん
2005/11/04(金) 16:45:15てか、正規表現でなければならない理由は何?
>>11 の最後が一番話が早いと思うが。
0017デフォルトの名無しさん
2005/11/04(金) 16:47:53001810
2005/11/04(金) 17:44:44>正規表現でなければならない理由は何?
なぜなら、ここが正規表現スレだから。
必要とか不必要とか、そんなこというなよ。ロマンチックじゃないぜ。
0019デフォルトの名無しさん
2005/11/04(金) 18:12:48じゃあスレ違い。他所へ行け。
0021デフォルトの名無しさん
2005/11/04(金) 18:29:42ほほぅ。
0022デフォルトの名無しさん
2005/11/04(金) 21:02:36なるほどなるほど。
002310
2005/11/04(金) 21:11:32スレ違いと言われても・・・
こういう正規表現って他にも応用は効くと思うよ。
>>15のがいけると思ったけど、2560などを「マッチングさせない」ようにはできなかった。
^((2([0-4][0-9]|5[0-5]))|(1?[0-9]?[0-9]))$
入力が単語ならこれでいけた。サブパターンがいっぱい出来てうっとおしいけど
0024C ◆ntztQrP5vg
2005/11/07(月) 00:17:150025デフォルトの名無しさん
2005/11/13(日) 23:05:35[\x0-\xff]って書くんですか?
0026デフォルトの名無しさん
2005/11/13(日) 23:13:45それ.と同じ
0027デフォルトの名無しさん
2005/11/13(日) 23:20:040028デフォルトの名無しさん
2005/11/14(月) 00:39:15sedやawkなら.は改行にもマッチしますよ。探索空間が通常行単位なので、
行末の自然な改行とマッチしないように見えるだけでしょう。
sedならNなどで、awkなら変数に陽に改行を代入するなどしてお試しください。。
perlもマッチ演算子にsなどのoptionをつければ.が改行にもマッチします。
これも仕様をよくみると、普段は改行にマッチさせないというよりむしろ、
普段は探索空間を行単位にしていることからくると解釈すべきでしょう。
0029デフォルトの名無しさん
2005/11/24(木) 13:39:05ソースの解析のように読み進んでって"if"来たから"ifルーチン"処理モードに入ってとか"void"来たからメソッド処理モードに入ってとかやるのは苦手?
0030デフォルトの名無しさん
2005/11/24(木) 13:44:32無理すね。
そういう用途じゃないから。
正規表現は、あるクラスの文字列の集合(言語)を表現してるだけですから。
(で、たいていはパターンマッチに使う。)
ツール(sedなりperlなりlexなり)がそういうこと>>29やるために
正規表現を使うというstoryでしょう。
003129
2005/11/24(木) 14:07:14> ツール(sedなりperlなりlexなり)がそういうこと>>29やるために
> 正規表現を使うというstoryでしょう。
この場合、正規表現使うというのはどういう使い方なんでしょ?
たとえばifロジックの中の判断ルーチン部分が式の形になってるかどうかをチェックするために使うとか?
0032デフォルトの名無しさん
2005/11/24(木) 18:38:07それは構文解析器って奴の仕事だね。yaccとかbisonとか。
正規表現はその前の字句解析に使うね。lexとかflexとか。
字句解析で正規表現をどう使うかはググってもらったほうがわかりやすい解説があると思う。
003332
2005/11/24(木) 18:40:12で、lexとかflexは字句解析器を生成するためのツール。
003429
2005/11/24(木) 19:26:30lex/yacc自体の存在は知ってるんですが、自分のプログラム(C#)にどう生かすか、わかってません(´・ω・`)
いろいろ見てみます。
0035デフォルトの名無しさん
2005/11/25(金) 01:45:190036デフォルトの名無しさん
2005/11/25(金) 02:03:33岡江さんが作者だったのかー
0037デフォルトの名無しさん
2005/11/25(金) 04:16:580038デフォルトの名無しさん
2005/11/25(金) 11:12:39Yet Another Compiler Compiler
という全員が知っているようなマジレスをして
叩かれるのを待ってみるw
0039デフォルトの名無しさん
2005/11/25(金) 11:42:51ヤクの亜流だからバイソンという洒落で名前がついたと言う
嘘かホントか判らん事を書いて叩かれるのを待ってみる♪
0040デフォルトの名無しさん
2005/11/25(金) 11:44:22マジレスすると、キャイーンの天野っち。
0041デフォルトの名無しさん
2005/11/25(金) 11:47:44ttp://www.cjn.or.jp/docs/dic/unix-term-dic.html
と、信憑性が微妙なリソースへのポインタを示して
叩かれるのをry
0042酩酊 ◆TWARamEjuA
NGNG0043デフォルトの名無しさん
NGNG0044デフォルトの名無しさん
2005/11/27(日) 13:24:38$&はパターンマッチした文字列が入っているので直感的にわかりやすいんだけど
0045デフォルトの名無しさん
2005/11/27(日) 14:21:47適当な例で実行して結果を表示するとか試せばすぐわかるじゃん。
それと、一応、$~みたいなあまり普遍的でないものに言及するなら、
数ある正規表現の中のどの実装(仕様)のことなのか明記してくれ。
0046デフォルトの名無しさん
2005/12/11(日) 08:14:23xyzzyとかのエディタのgrepでやろうとしたのですが、検索してもよくわかりません。
Rubyとかスクリプト言語を使わないと無理でしょうか?
0047デフォルトの名無しさん
2005/12/11(日) 08:55:100048デフォルトの名無しさん
2005/12/11(日) 08:55:380049デフォルトの名無しさん
2005/12/11(日) 11:03:460050デフォルトの名無しさん
2005/12/11(日) 11:18:280051デフォルトの名無しさん
2005/12/11(日) 11:31:430052デフォルトの名無しさん
2005/12/11(日) 15:35:100053デフォルトの名無しさん
2005/12/13(火) 11:26:57検索結果を置換すればよろしかろ。
0054デフォルトの名無しさん
2005/12/15(木) 18:36:48さがす正規表現って、下記でよいでしょうか。
^(\s| )*$
既出でしたらすいません。
0055デフォルトの名無しさん
2005/12/15(木) 19:02:130056酩酊 ◆TWARamEjuA
NGNG005754
2005/12/15(木) 22:25:58↑全角スペース
ですかね?
とある入力項目のなかで、
\s と全角スペースで構成された、いわゆる”空行”を
はじきたいのです。
0058酩酊 ◆TWARamEjuA
NGNG^$ → 空行
にもマッチするので、
^(\s| )+$
なのではないかと。。。
0059デフォルトの名無しさん
2005/12/16(金) 11:52:47有難うございます。
入力フォームで、ようするに何も入力しない場合や、
スペースのみの場合を弾きたかったので、
^$ → 空行 でマッチしてもOKでした。
^[\s ]*$ ならば、未入力のケースと
スペースのみの場合、両方マッチできました。
0060デフォルトの名無しさん
2005/12/19(月) 13:56:19xx<tag val="xxx">xxx</tag>
************************
こんな文字列があったとして
<>で囲まれている部分のみをマッチングするのは
<.+?>
ですが、その逆の囲まれていない部分のみをマッチングするには
どうしたらいいでしょうか。
0061デフォルトの名無しさん
2005/12/19(月) 14:25:34これじゃいかんの?
~$ perl -e '$var="xx<tag val=\"xxx\">xxx<\/tag>"; $var=~s/<.+?>//g); print "$var\n";'
xxxxx
006260
2005/12/19(月) 14:32:26006360
2005/12/19(月) 14:36:17************************
xx<tag val="xxx">xxx</tag>
************************
の<>で囲まれた部分は維持したまま
囲まれていない部分をreplaceする必要があるのです。
0064デフォルトの名無しさん
2005/12/19(月) 14:37:24sed -e 's/[^<]*</置き換えたいもの</ -e 's/[^<]*/置き換えたいもの/'
みたいな感じでは?
0065デフォルトの名無しさん
2005/12/19(月) 14:50:09006660
2005/12/19(月) 14:50:54しかし、たとえば
************************
xxx<tag val="xxx">xxx_xxx</tag>
************************
の<>で囲まれていない"xxx" を"yyy"にreplaceしようとすると
************************
yyy<tag val="xxx">xxx_yyy</tag>
************************
となってしまいます。
0067デフォルトの名無しさん
2005/12/19(月) 15:19:59自分が買った本に、”0〜255”の正規表現が載っていたYO。
[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5]
0068デフォルトの名無しさん
2005/12/19(月) 16:02:14一般的に「ほげほげでない」条件の正規表現はめんどくさいのだが、今回の場合は
文字列の先頭または「>」 と 「<」または文字列の最後 にはさまれた部分と
考えれば簡単だ。
0069デフォルトの名無しさん
2005/12/19(月) 16:50:26http://www.din.or.jp/%7Eohzaki/regex.htm#ReplaceOutside
O崎さんすら3度も書き換えてる!むずいんだ。
~$ perl -e '$var="xx<tag val1=\"xxx\">xxx<\/tag>xx<tag val2=\"xxx\">xxx<\/tag>xx"; $var =~ s/(?:^|(?<=>))(.*?)(?:$|(?=<))/yyy/g; print $var, "\n";'
yyy<tag val1="xxx">yyy</tag>yyy<tag val2="xxx">yyy</tag>yyy
0070デフォルトの名無しさん
2005/12/19(月) 16:56:17だけど
2002/10/21 「タグの外側だけ対象に置換する」スクリプトと文章追加
の最後に書いてある解決法、理解できん。
0071デフォルトの名無しさん
2005/12/19(月) 23:10:18まさかぐぐりもしないで質問したんだろうか?
0072デフォルトの名無しさん
2005/12/20(火) 01:18:47検索がお上手ですね
、とでもいってほしいのか?
0073デフォルトの名無しさん
2005/12/20(火) 09:52:150075デフォルトの名無しさん
2005/12/20(火) 10:17:03007660
2005/12/20(火) 12:12:14以下のようにしました。
<?php
$str = 'xxx1<tag val="xxx2">xxx3</tag><tag val="xxx4">xxx5_xxx6</tag>xxx7';
$search = 'xxx';
$replace = 'yyy';
$search = '([^<]*)'.$search;
$replace = '$1'.$replace;
$str = preg_replace ('/'.$search.'/',$replace,$str);
while ( preg_match('/>'.$search.'/',$str) )
{
$str = preg_replace ('/>'.$search.'/','>'.$replace,$str);
}
echo $str;
/* output
yyy1<tag val="xxx2">yyy3</tag><tag val="xxx4">yyy5_yyy6</tag>yyy7
*/
?>
0077デフォルトの名無しさん
2005/12/20(火) 13:50:52だったなら、最初からスクリプトのスレに行けばいいじゃんかよ...
0078デフォルトの名無しさん
2005/12/20(火) 22:54:110079デフォルトの名無しさん
2005/12/21(水) 02:31:14正規表現だけじゃ解決できなかったっていう話しですよ。
内容ちゃんと理解してからレスしてね。
粘着質な自治厨さん。
008077
2005/12/21(水) 03:41:09「行ったら楽だったのでは」と読み替えてくれ。
ある問題につきあたったとき、それをなぜ正規表現の範囲で解決しなければ
ならないと考える人が多いのか、不思議なんだよ。悪い意味のコダワリなのでは。
実際、最初に問題が提示されてから解決まで丸1日もかかっていますよ。
それから「閉じている」というのは普及した技術用語で、ある技術や問題が特定の
範囲に囲い込まれている or 「〜だけで解決や表現できる」ことを意味します。
0081デフォルトの名無しさん
2005/12/21(水) 05:06:06ここが正規表現スレだからだろ
ご飯の炊き方スレでパンの焼き方解説してどうするんだよ
0082デフォルトの名無しさん
2005/12/21(水) 09:39:00スレタイ50000回声に出して嫁
0083デフォルトの名無しさん
2005/12/21(水) 09:57:11正規表現を記述しようと試みるのは愚の骨頂といえよう
0084デフォルトの名無しさん
2005/12/21(水) 10:04:290085デフォルトの名無しさん
2005/12/21(水) 10:05:44そういう戯言は他のスレで言って来い
0086デフォルトの名無しさん
2005/12/21(水) 12:11:410087デフォルトの名無しさん
2005/12/24(土) 04:34:200088デフォルトの名無しさん
2005/12/24(土) 07:55:09無理。
'2'を数の2にevaluateする仕組みが必ずどこかに必要。
桁数が有限なら自明な和(正規表現の|)で実現できるけど、実用にはならない。
0089デフォルトの名無しさん
2005/12/24(土) 11:11:26まぁその evaluate する仕組みなわけだが、Perl なら
print "$_ : ", /^(\d+)(??{"a{$1}"})\z/ ? 'match' : 'unmatch', ".\n"
for '2aa', '5aaaaa', '7aaa', '11aaaaaaaaaaa', 'aaaaa';
009087
2005/12/24(土) 18:59:20レスありがとうございます。
が,(??{"a{$1}"})のところがよくわかりませんでした。。
http://www.kt.rim.or.jp/~kbk/perl5.005/perlre.html
に少し解説してある拡張構文の(?{ code })を使われてると推測したのですが,
「??」と2個続くとどういう意味になるのでしょう?
0091デフォルトの名無しさん
2005/12/24(土) 19:17:47http://www.kt.rim.or.jp/~kbk/regex/regex.html#QUESTIONMIN
0092デフォルトの名無しさん
2005/12/24(土) 23:12:48違う。
>>90
http://www.kt.rim.or.jp/~kbk/perl-5.8/perlreref.html#_g_______extended_constructs_
0094デフォルトの名無しさん
2006/01/04(水) 16:38:50A) <a href="mailto:xxxxx">作者名</a>
B) 作者名
AとBの2パターンがあったとして、どちらにもマッチする方法で「作者名」だけを \1 に渡すにはどうしたらよいでしょうか?
^.*>(.*)<.*$ や ^[.*>|.*](.*)[.*<|.*]$ などとしているのですが、どうにも絞り込めません。
0095デフォルトの名無しさん
2006/01/04(水) 17:58:40言語は?
0096デフォルトの名無しさん
2006/01/04(水) 19:24:17とりあえず純粋正規表現(?)のみじゃね?
言語のパワーを借りないと無理っぽいけど
つーか、この仕様の書き方だと
C) <a href="http://xxxx">作者名</a>
のときは 『<a href="http://xxxx">作者名</a>』 が
作者名になるな。うん。
0097デフォルトの名無しさん
2006/01/04(水) 21:36:20XMLのスレには含めたくないみたい。
0098デフォルトの名無しさん
2006/01/06(金) 22:29:59string text = "<a href=\"mailto:xxxxx\">作者名</a>\r\n作者名";
Regex re = new Regex("(^.*>(?<name>.+)<.*$)|(^(?<name>.+)$)", RegexOptions.MultiLine);
foreach(Match m in re.Matches(text)){
Console.WriteLine(m.Groups["name"].Value);
}
0099デフォルトの名無しさん
2006/01/19(木) 18:08:30$_ = 'jvmv log:99jikvdglog:100bmvkllog:200';
s/.*log:(\d+).*/$1/;
print $_;
これだと最長一致してしまうので、200が表示されます。
s/.*log:(\d+)?.*/$1/; としてみましたがだめでした。
最初の 99 を取るにはどうしたら良いのでしょうか?
0100デフォルトの名無しさん
2006/01/19(木) 18:42:010101デフォルトの名無しさん
2006/01/19(木) 18:57:20■ このスレッドは過去ログ倉庫に格納されています