トップページ⇒tech
1001コメント258KB

正規表現 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
重複。削除依頼出せよ>>1

性器表現 part2
http://pc8.2ch.net/test/read.cgi/tech/1131027222/
0005デフォルトの名無しさん2005/11/03(木) 23:38:52
>>2
重複してるのか?
0006デフォルトの名無しさん2005/11/03(木) 23:41:16
>性器表現 part2
>http://pc8.2ch.net/test/read.cgi/tech/1131027222/

↑の方を削除依頼すればいいのでは?
0007デフォルトの名無しさん2005/11/04(金) 00:03:13
さすがにこっちが本家だな。何が重複だか。バカじゃねーの?
0008デフォルトの名無しさん2005/11/04(金) 00:11:13
こんなことで喧嘩するなwww
0009デフォルトの名無しさん2005/11/04(金) 02:48:53
n
0010デフォルトの名無しさん2005/11/04(金) 13:53:13
0〜255までの数字を正規表現でどう表せばよいですか?
0011デフォルトの名無しさん2005/11/04(金) 14:34:01
>>10
数字が 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
0012102005/11/04(金) 15:47:07
>>11
(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
>>10
言語は? Perl なら (?:1\d?\d?|2(?:5[0-5]?|[0-4]?\d?)|[3-9]\d?|0)
0014102005/11/04(金) 16:20:22
>>13
言語は何でもいいよ。phpでも秀丸マクロでも。

逆にいえば、どの言語でもそこそこ動くよう
一般的?なパターン構文のみを使った
正規表現がいいな
0015デフォルトの名無しさん2005/11/04(金) 16:37:15
>>12
頭と尻に[^0-9]付ければ良いだけちゃうの?
0016デフォルトの名無しさん2005/11/04(金) 16:45:15
>>10
てか、正規表現でなければならない理由は何?
>>11 の最後が一番話が早いと思うが。
0017デフォルトの名無しさん2005/11/04(金) 16:47:53
ipアドレスの正規表現なら前にあったような
0018102005/11/04(金) 17:44:44
>>16
>正規表現でなければならない理由は何?
なぜなら、ここが正規表現スレだから。
必要とか不必要とか、そんなこというなよ。ロマンチックじゃないぜ。
0019デフォルトの名無しさん2005/11/04(金) 18:12:48
>>10
じゃあスレ違い。他所へ行け。
0020102005/11/04(金) 18:20:27
>>19
あ?お前偉そうだな。
その調子なら他所でもやっていける。
お前こそこのスレからでてってくれ。
俺にこそこのスレは相応しい。
0021デフォルトの名無しさん2005/11/04(金) 18:29:42
>>20
ほほぅ。
0022デフォルトの名無しさん2005/11/04(金) 21:02:36
>>20
なるほどなるほど。
0023102005/11/04(金) 21:11:32
>>19
スレ違いと言われても・・・
こういう正規表現って他にも応用は効くと思うよ。

>>15のがいけると思ったけど、2560などを「マッチングさせない」ようにはできなかった。
^((2([0-4][0-9]|5[0-5]))|(1?[0-9]?[0-9]))$
入力が単語ならこれでいけた。サブパターンがいっぱい出来てうっとおしいけど
0024C ◆ntztQrP5vg 2005/11/07(月) 00:17:15
C#C#C#〜!
0025デフォルトの名無しさん2005/11/13(日) 23:05:35
全てのシングルバイト文字にマッチさせるときは
[\x0-\xff]って書くんですか?
0026デフォルトの名無しさん2005/11/13(日) 23:13:45
>>25
それ.と同じ
0027デフォルトの名無しさん2005/11/13(日) 23:20:04
.は改行にはマッチしないでしょ
0028デフォルトの名無しさん2005/11/14(月) 00:39:15
>>27
sedやawkなら.は改行にもマッチしますよ。探索空間が通常行単位なので、
行末の自然な改行とマッチしないように見えるだけでしょう。

sedならNなどで、awkなら変数に陽に改行を代入するなどしてお試しください。。

perlもマッチ演算子にsなどのoptionをつければ.が改行にもマッチします。
これも仕様をよくみると、普段は改行にマッチさせないというよりむしろ、
普段は探索空間を行単位にしていることからくると解釈すべきでしょう。
0029デフォルトの名無しさん2005/11/24(木) 13:39:05
正規表現勉強中なのですが・・・
ソースの解析のように読み進んでって"if"来たから"ifルーチン"処理モードに入ってとか"void"来たからメソッド処理モードに入ってとかやるのは苦手?
0030デフォルトの名無しさん2005/11/24(木) 13:44:32
>>29
無理すね。
そういう用途じゃないから。
正規表現は、あるクラスの文字列の集合(言語)を表現してるだけですから。
(で、たいていはパターンマッチに使う。)

ツール(sedなりperlなりlexなり)がそういうこと>>29やるために
正規表現を使うというstoryでしょう。
0031292005/11/24(木) 14:07:14
>>30
> ツール(sedなりperlなりlexなり)がそういうこと>>29やるために
> 正規表現を使うというstoryでしょう。
この場合、正規表現使うというのはどういう使い方なんでしょ?
たとえばifロジックの中の判断ルーチン部分が式の形になってるかどうかをチェックするために使うとか?
0032デフォルトの名無しさん2005/11/24(木) 18:38:07
>>31
それは構文解析器って奴の仕事だね。yaccとかbisonとか。
正規表現はその前の字句解析に使うね。lexとかflexとか。
字句解析で正規表現をどう使うかはググってもらったほうがわかりやすい解説があると思う。
0033322005/11/24(木) 18:40:12
あ、yaccとかbisonとかって言うのは構文解析を行うものじゃなくて構文解析器を生成するためのツールね。
で、lexとかflexは字句解析器を生成するためのツール。
0034292005/11/24(木) 19:26:30
>>32,>>33 感謝。
lex/yacc自体の存在は知ってるんですが、自分のプログラム(C#)にどう生かすか、わかってません(´・ω・`)
いろいろ見てみます。

0035デフォルトの名無しさん2005/11/25(金) 01:45:19
yaccの作者って、今ははなまるマーケットにレギュラー出演してるんだっけ
0036デフォルトの名無しさん2005/11/25(金) 02:03:33
>>35
岡江さんが作者だったのかー
0037デフォルトの名無しさん2005/11/25(金) 04:16:58
やっくんすげー
0038デフォルトの名無しさん2005/11/25(金) 11:12:39
ここで
Yet Another Compiler Compiler
という全員が知っているようなマジレスをして
叩かれるのを待ってみるw
0039デフォルトの名無しさん2005/11/25(金) 11:42:51
ここで
ヤクの亜流だからバイソンという洒落で名前がついたと言う
嘘かホントか判らん事を書いて叩かれるのを待ってみる♪
0040デフォルトの名無しさん2005/11/25(金) 11:44:22
>>36
マジレスすると、キャイーンの天野っち。
0041デフォルトの名無しさん2005/11/25(金) 11:47:44
>>39
ttp://www.cjn.or.jp/docs/dic/unix-term-dic.html

と、信憑性が微妙なリソースへのポインタを示して
叩かれるのをry
0042酩酊 ◆TWARamEjuA NGNG
正規表現は、やはりMかもしれない。
0043デフォルトの名無しさんNGNG
>>42
0044デフォルトの名無しさん2005/11/27(日) 13:24:38
正規表現の$~って具体的にはどんなデータが入ってるの?
$&はパターンマッチした文字列が入っているので直感的にわかりやすいんだけど
0045デフォルトの名無しさん2005/11/27(日) 14:21:47
>>44
適当な例で実行して結果を表示するとか試せばすぐわかるじゃん。

それと、一応、$~みたいなあまり普遍的でないものに言及するなら、
数ある正規表現の中のどの実装(仕様)のことなのか明記してくれ。
0046デフォルトの名無しさん2005/12/11(日) 08:14:23
Windowsで正規表現にマッチする文字列のみ(行全体じゃなく)を表示・保存するにはどうすればいいのでしょうか?
xyzzyとかのエディタのgrepでやろうとしたのですが、検索してもよくわかりません。
Rubyとかスクリプト言語を使わないと無理でしょうか?
0047デフォルトの名無しさん2005/12/11(日) 08:55:10
秀丸でさえできるし、yzzyでできないわけがない。
0048デフォルトの名無しさん2005/12/11(日) 08:55:38
xyzzyでできないわけがない。
0049デフォルトの名無しさん2005/12/11(日) 11:03:46
どうやるの?
0050デフォルトの名無しさん2005/12/11(日) 11:18:28
おまえ一々うんこの仕方考えながらするのか?
0051デフォルトの名無しさん2005/12/11(日) 11:31:43
普通にgrepすると余計なのまで出ちゃう。マッチする文字列だけでいいの。
0052デフォルトの名無しさん2005/12/11(日) 15:35:10
http://www.vector.co.jp/soft/win95/util/se015016.html
0053デフォルトの名無しさん2005/12/13(火) 11:26:57
>>46
検索結果を置換すればよろしかろ。
0054デフォルトの名無しさん2005/12/15(木) 18:36:48
半角スペースと全角スペースのみで構成されてるデータを
さがす正規表現って、下記でよいでしょうか。
^(\s| )*$

既出でしたらすいません。
0055デフォルトの名無しさん2005/12/15(木) 19:02:13
\sはタブも含むし半角と全角スペースが混じっている行にはマッチしないよ
0056酩酊 ◆TWARamEjuA NGNG
*だと^$にもマッチする悪寒♪@空文字列
0057542005/12/15(木) 22:25:58
^[\s ]*$
  ↑全角スペース 
ですかね?

とある入力項目のなかで、
\s と全角スペースで構成された、いわゆる”空行”を
はじきたいのです。
0058酩酊 ◆TWARamEjuA NGNG
だからそれだと
^$ → 空行
にもマッチするので、
^(\s| )+$
なのではないかと。。。
0059デフォルトの名無しさん2005/12/16(金) 11:52:47
>>58
有難うございます。
入力フォームで、ようするに何も入力しない場合や、
スペースのみの場合を弾きたかったので、
^$ → 空行 でマッチしてもOKでした。
^[\s ]*$ ならば、未入力のケースと
スペースのみの場合、両方マッチできました。
0060デフォルトの名無しさん2005/12/19(月) 13:56:19
************************
xx<tag val="xxx">xxx</tag>
************************

こんな文字列があったとして
<>で囲まれている部分のみをマッチングするのは
<.+?>
ですが、その逆の囲まれていない部分のみをマッチングするには
どうしたらいいでしょうか。
0061デフォルトの名無しさん2005/12/19(月) 14:25:34
>>60
これじゃいかんの?
~$ perl -e '$var="xx<tag val=\"xxx\">xxx<\/tag>"; $var=~s/<.+?>//g); print "$var\n";'
xxxxx
0062602005/12/19(月) 14:32:26
マッチングさせるだけでなくreplaceが必要なのです。
0063602005/12/19(月) 14:36:17
連投すみません
************************
xx<tag val="xxx">xxx</tag>
************************
の<>で囲まれた部分は維持したまま
囲まれていない部分をreplaceする必要があるのです。
0064デフォルトの名無しさん2005/12/19(月) 14:37:24
それじゃ
sed -e 's/[^<]*</置き換えたいもの</ -e 's/[^<]*/置き換えたいもの/'
みたいな感じでは?
0065デフォルトの名無しさん2005/12/19(月) 14:50:09
情報小出しの典型的な教えてクン
0066602005/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
>>60
一般的に「ほげほげでない」条件の正規表現はめんどくさいのだが、今回の場合は
文字列の先頭または「>」 と 「<」または文字列の最後 にはさまれた部分と
考えれば簡単だ。
0069デフォルトの名無しさん2005/12/19(月) 16:50:26
Perlメモにそのものずばりがあったよ。
http://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
>>69 正規表現 マッチしない でぐぐったらそんなの簡単に見つかるわけだし
まさかぐぐりもしないで質問したんだろうか?
0072デフォルトの名無しさん2005/12/20(火) 01:18:47
>>71
検索がお上手ですね  











、とでもいってほしいのか?
0073デフォルトの名無しさん2005/12/20(火) 09:52:15
下手といわれるよりはマシだろ
0074602005/12/20(火) 10:08:26
>>69
ありがとうございます。
PHPで \G が使えないのでそのへんのロジックは
自分で書くしかないかなと思ってます。
0075デフォルトの名無しさん2005/12/20(火) 10:17:03
質問小出し作戦
0076602005/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:11
だから情報を小出しにするやつの相手しちゃダメなんだって
0079デフォルトの名無しさん2005/12/21(水) 02:31:14
コードを書いてもいい、んじゃなくて
正規表現だけじゃ解決できなかったっていう話しですよ。
内容ちゃんと理解してからレスしてね。
粘着質な自治厨さん。
0080772005/12/21(水) 03:41:09
「行けばいいじゃんか」って書き方が気に障ったのならスマンな。
「行ったら楽だったのでは」と読み替えてくれ。

ある問題につきあたったとき、それをなぜ正規表現の範囲で解決しなければ
ならないと考える人が多いのか、不思議なんだよ。悪い意味のコダワリなのでは。

実際、最初に問題が提示されてから解決まで丸1日もかかっていますよ。


それから「閉じている」というのは普及した技術用語で、ある技術や問題が特定の
範囲に囲い込まれている or 「〜だけで解決や表現できる」ことを意味します。
0081デフォルトの名無しさん2005/12/21(水) 05:06:06
>>80
ここが正規表現スレだからだろ

ご飯の炊き方スレでパンの焼き方解説してどうするんだよ
0082デフォルトの名無しさん2005/12/21(水) 09:39:00
>>80
スレタイ50000回声に出して嫁
0083デフォルトの名無しさん2005/12/21(水) 09:57:11
どのていどの妥当性をもって良しとするか前提がない
正規表現を記述しようと試みるのは愚の骨頂といえよう
0084デフォルトの名無しさん2005/12/21(水) 10:04:29
初心者のうちは文字列処理=正規表現だからしょうがないとも言える
0085デフォルトの名無しさん2005/12/21(水) 10:05:44
>>83
そういう戯言は他のスレで言って来い
0086デフォルトの名無しさん2005/12/21(水) 12:11:41
ということで>>85が正規表現の範囲で解決してくれるそうです。
0087デフォルトの名無しさん2005/12/24(土) 04:34:20
「2aa」や「5aaaaa」といった文字列,つまり最初に数字があってそのあとにその数字の数だけ「a」が続くという文字列を正規表現であらわすにはどうすればよいでしょうか。(\d+)a{\1}という記述では拾えませんでした。。
0088デフォルトの名無しさん2005/12/24(土) 07:55:09
>>87
無理。
'2'を数の2にevaluateする仕組みが必ずどこかに必要。
桁数が有限なら自明な和(正規表現の|)で実現できるけど、実用にはならない。

0089デフォルトの名無しさん2005/12/24(土) 11:11:26
>>87-88
まぁその evaluate する仕組みなわけだが、Perl なら

print "$_ : ", /^(\d+)(??{"a{$1}"})\z/ ? 'match' : 'unmatch', ".\n"
  for '2aa', '5aaaaa', '7aaa', '11aaaaaaaaaaa', 'aaaaa';
0090872005/12/24(土) 18:59:20
>>88-89
レスありがとうございます。
が,(??{"a{$1}"})のところがよくわかりませんでした。。
http://www.kt.rim.or.jp/~kbk/perl5.005/perlre.html
に少し解説してある拡張構文の(?{ code })を使われてると推測したのですが,
「??」と2個続くとどういう意味になるのでしょう?
0091デフォルトの名無しさん2005/12/24(土) 19:17:47
>>90
http://www.kt.rim.or.jp/~kbk/regex/regex.html#QUESTIONMIN
0092デフォルトの名無しさん2005/12/24(土) 23:12:48
>>91
違う。

>>90
http://www.kt.rim.or.jp/~kbk/perl-5.8/perlreref.html#_g_______extended_constructs_
0093912005/12/24(土) 23:20:14
>>92
ゴメソよく見てなかった…
0094デフォルトの名無しさん2006/01/04(水) 16:38:50
\1 に渡す方法について教えて下さい

A) <a href="mailto:xxxxx">作者名</a>
B) 作者名

AとBの2パターンがあったとして、どちらにもマッチする方法で「作者名」だけを \1 に渡すにはどうしたらよいでしょうか?
^.*>(.*)<.*$ や ^[.*>|.*](.*)[.*<|.*]$ などとしているのですが、どうにも絞り込めません。
0095デフォルトの名無しさん2006/01/04(水) 17:58:40
>>94
言語は?
0096デフォルトの名無しさん2006/01/04(水) 19:24:17
>>95
とりあえず純粋正規表現(?)のみじゃね?
言語のパワーを借りないと無理っぽいけど

つーか、この仕様の書き方だと
C) <a href="http://xxxx">作者名</a>
のときは 『<a href="http://xxxx">作者名</a>』 が
作者名になるな。うん。
0097デフォルトの名無しさん2006/01/04(水) 21:36:20
つーかHTMLパーサのスレってなかったっけ?
XMLのスレには含めたくないみたい。
0098デフォルトの名無しさん2006/01/06(金) 22:29:59
// C#
string 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
#Perl 5.8
$_ = 'jvmv log:99jikvdglog:100bmvkllog:200';
s/.*log:(\d+).*/$1/;
print $_;

これだと最長一致してしまうので、200が表示されます。
s/.*log:(\d+)?.*/$1/; としてみましたがだめでした。
最初の 99 を取るにはどうしたら良いのでしょうか?
0100デフォルトの名無しさん2006/01/19(木) 18:42:01
s/.*log:(\d+)\D*/$1/
0101デフォルトの名無しさん2006/01/19(木) 18:57:20
s/.*?log:(\d+).*/$1/;
■ このスレッドは過去ログ倉庫に格納されています