トップページ⇒php
981コメント301KB

正規表現道場@2ch Part4

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん05/01/17 11:51:25ID:SH1ygN1P
Perlに限らずスクリプト系言語で大活躍の正規表現。
このスレは有用そうな正規表現を紹介したり、
どう表現したらいいかわからないときに質問をしたりするためのスレッドです。
質問するときは使用言語や得たい結果をなるべく詳しく書きましょう。

註:& や " を書くときには、& " と描いておきましょうね。

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/
正規表現道場@2ch Part3 s/煽り|荒らし/あぼーん/g
 http://pc5.2ch.net/test/read.cgi/php/1069245758/
0475nobodyさん2005/07/01(金) 02:59:52ID:???
どうでもいいけど、その 無意味な </a> は何なんだろうね。
0476nobodyさん2005/07/01(金) 12:53:26ID:???
番号大きくなるとが数字だけじゃなくていずれ<a href="mailto:hage">とか文字列に代わるのかな?
0477nobodyさん2005/07/02(土) 09:11:37ID:???
正規表現で、fooを含みbarを含まない行をヒットさせる方法はないでしょいか?

いまのところ、文字列fooを含まない行は
^(((([^f]*)*(f+[^o][^f]*)*)*)*(f+o[^o][^f]*)*)*$
でヒットすることがわかりました。
この先がどうしてもわからないのです。
お知恵をお貸し下さい。
0478nobodyさん2005/07/02(土) 12:29:04ID:BTmtp6GJ
/^(((((^-^))(+_+)[*o*]f^_^;)(^o^)f^_^;))$/
0479nobodyさん2005/07/02(土) 16:29:59ID:???
>>477
言語は?

http://www.din.or.jp/~ohzaki/regex.htm#And

print "$_ => ", /^(?=.*foo)(?:(?!bar).)*\z/ ? 'o' : 'x', "\n" for qw(
  abarcdefoog abcdefooghi abarcdefghi abcdefghijk
  gfooedcbara ihgfooedcba ihgfedcbara
);
0480nobodyさん2005/07/02(土) 17:01:43ID:???
>>478 ちょっとわろたw
0481nobodyさん2005/07/02(土) 17:17:32ID:???
>>479
ありがとうございました。
試してみましたが、うまくいかないようです。
ちなみにperlではありません。
ここにあるコンポーネントを使っています。
http://homepage1.nifty.com/bmonkey/delphi/delphi.html#REXP
0482nobodyさん2005/07/02(土) 17:29:23ID:???
分割処理するかPCREを使うのが手っ取り早い
0483nobodyさん2005/07/02(土) 17:49:47ID:???
「ほげほげを含まない文字列にマッチさせたい」というのを見るたびに
「ほげほげを含む文字列にマッチ」させて否定をとりゃいいじゃんと
思うのだが、そうしないのは何か理由があるのだろうか。



0484nobodyさん2005/07/02(土) 17:54:12ID:???
他のソフト探せば?
ここ "Web"Prog だしなあ。
0485nobodyさん2005/07/02(土) 17:55:52ID:???
>>483
実装されていないから
0486nobodyさん2005/07/02(土) 18:36:20ID:???
>>485
いや、意味不明だから。あんたのレス。
0487nobodyさん2005/07/02(土) 19:47:06ID:???
そのソフトでは"否定"がとれないってことだろ? 意味明快。
0488nobodyさん2005/07/02(土) 21:57:50ID:???
>>485,487
帰ってこ〜い
0489nobodyさん2005/07/02(土) 23:34:48ID:???
>>487
そのソフトってどのソフトのこと言ってんの?
0490nobodyさん2005/07/03(日) 04:10:52ID:???
やっぱここは、正規表現最強のPerlをお勧めしておく。
0491nobodyさん2005/07/03(日) 14:30:29ID:???
>>487
「否定が取れないソフト」の場合は確かに仕方ないけど、
そうでないケースもこのスレの質問では結構多いと思う。
それに、 >>484 の言うとおり、 "Web"Prog でそんなソフトはあまり無いと思われ。
0492nobodyさん2005/07/04(月) 11:06:12ID:???
ある正規表現が与えられたときにその正規表現に
マッチしない文字列にのみマッチする正規表現は
一般には作れますか? 有限オートマトンだから
作れそうな気はするのですが。

0493nobodyさん2005/07/04(月) 16:44:56ID:LXfnoi1Z
誘導されてきました。PHPでの質問です。

変数$html にとあるHTMLファイルを読み込みまして、そのHTMLに記述されている
<!-- コメント1 --> から <!-- /コメント2 --> までの範囲にある文字列(タグ含む)を
変数$hensu に代入したいのです。

preg_match を使えとのことだったんですが、具体的にどうやればよいのか分かりません。
どうかご教授頂けますでしょうか。お願い致します。
0494nobodyさん2005/07/04(月) 16:49:45ID:???
>>493
あのね、
http://pc8.2ch.net/test/read.cgi/php/1117945031/769
に答え出てますよ。
0495nobodyさん2005/07/04(月) 16:56:37ID:???
>>494
あっ。。。時間差で答えが出ていました。お騒がせしました。
0496nobodyさん2005/07/06(水) 21:23:47ID:uSLwEBZ9
123..45.78.9
見たいな数値と.の組み合わせの文字列を
123.45789のように
最初に出現する.を除き除去するにはどうすればよいでしょうか?
04974962005/07/06(水) 21:26:13ID:uSLwEBZ9
書き忘れました
javascriptで行うつもりです。
0498nobodyさん2005/07/06(水) 22:06:55ID:???
とりあえず手抜き版
var a='123..45.78.9'.replace(/\./,'<<escape>>').replace(/\./g,'').replace(/<<escape>>/,'.');
0499nobodyさん2005/07/08(金) 22:48:37ID:???
javascriptを使っての質問なのですが、
13756〜36865みたいな中途半端な数字の範囲は
どう表現すればよいのでしょうか?
0500nobodyさん2005/07/08(金) 23:27:34ID:???
>>499
本気で正規表現が適してると思うなら考え直せ。
05014992005/07/09(土) 00:10:04ID:???
>>500
正規表現でできると講師に聞いたのでやってみようといろいろ試したのですが全くわからなくて
ここで聞いてみたのですが・・
正規表現以外でできるものがあるのですか?
0502JAPU2005/07/09(土) 02:15:39ID:???
>>500 氏の行間補完計画

上記の条件を受理する正規表現は存在するので,理論上は可能。
たとえば,123 - 456 の整数なら (JS知らないのでPerlの表現になるけど)
^(?:12[3-9]|1[4-9]\d|[23]\d\d|4[0-4]\d|45[0-6])$
または
^(?:123|124|125| 途中略 |454|455|456)$
となる。13756 - 36865 でも同様に書ける。

でも,数字に変換して,その範囲かどうかチェックしたほうが速くない?
0503nobodyさん2005/07/09(土) 08:57:03ID:b0QlFvY6
ほのぼの(^-^)
0504nobodyさん2005/07/09(土) 18:16:14ID:XiYWtJZE
正規表現をマスターするには、どうすればいいですか?
0505JAPU2005/07/09(土) 19:55:25ID:???
Mastering Regular Expression という本があるよ。
(日本語版「詳説正規表現」)
0506nobodyさん2005/07/09(土) 22:43:09ID:???
4年ぶりくらいにJAPUタン見た。
0507nobodyさん2005/07/11(月) 09:54:07ID:???
>>506
最近、昔懐かしいコテをいろいろ名乗っている人がいるので
このJAPUたんも多分偽者ジャマイカ?
ほかにはT女の竹田とかも見た。
0508nobodyさん2005/07/12(火) 01:28:34ID:???
teranatukashisu
0509nobodyさん2005/07/12(火) 06:21:34ID:???
じゃあ俺は弐編を…
0510JAPU2005/07/12(火) 21:37:17ID:???
あの頃のトリップつかえなくなっているのでそれによる本物証明は出来ませんが。sage
http://www.japu.org/tmp/2ch.txt
0511nobodyさん2005/07/13(水) 06:58:27ID:???
把握した
05125072005/07/13(水) 09:46:20ID:???
>>510
あらら。失礼しました。
05135062005/07/14(木) 01:35:07ID:???
それではJAPUタンと一緒に皆で、
チャンコダイニング若で鍋でも囲もうじゃないか。
0514nobodyさん2005/07/17(日) 16:02:42ID:6p9wxgWq
$regex = '/\x1b\$([E-G])([\x21-\x7a])+\x0f/e';
この正規表現を理解したいです。

\$([E-G])
\x0f/e

この2点の意味がわかりません。
/はどのような意味を持つのでしょう?
よろしくお願いします。
05155142005/07/17(日) 23:47:07ID:???
他で聞いてみます。
0516nobodyさん2005/07/17(日) 23:49:01ID:???
>>515
まあそーゆーな

16進で1b,$そのもの,EからGのどれか,16進21から7aのどれかの中から一文字以上繰り返し,16進0f
で/は閉じ
eはフラグだから正規表現とは関係なし
05175162005/07/17(日) 23:53:33ID:???
/は閉じと書いたが万が一嘘かもしれん
その場合は/は/そのもの
最後のところは16進0f, /, eというシーケンス

ていうか何の言語での話か
わからないとわからないよ
0518nobodyさん2005/07/18(月) 00:25:05ID:???
PHPのPerl互換正規表現の話じゃないかと思われ。
05195142005/07/18(月) 00:57:29ID:???
レスどうもです。
/−/e
は正規表現の置換ですね。
$ = 0x24
E-G = 0x45-0x47
のことだとわかって納得しました。
本に書いてあるコードなんですが、直前まで16進数で解説してたのでわかりませんでした。
ありがとうございました。
0520nobodyさん2005/07/18(月) 01:04:26ID:jRcBcWiX
>>514
よかったら書名教えて

あと「正規表現の置換」て意味わからないから
0521nobodyさん2005/07/18(月) 01:40:16ID:???
性器表現のチカン >< 
s/♂/♀/g
0522nobodyさん2005/07/18(月) 03:34:06ID:???
それじゃ性転換!
0523nobodyさん2005/07/18(月) 12:46:19ID:???
521 :nobodyさん sage :2005/07/18(月) 01:40:16 ID:???
性器表現のチカン >< 
s/♂/♀/g


522 :nobodyさん sage :2005/07/18(月) 03:34:06 ID:???
それじゃ性転換!
0524nobodyさん2005/07/18(月) 16:54:26ID:fWK6qRMT
ワロスww
0525nobodyさん2005/07/18(月) 16:58:35ID:???
オモロスww
0526PHPで。2005/07/21(木) 10:09:56ID:jGRVDiGI
index?a=&b=&c=0&d=1&e=

こういったURLがあり、置換で必要のない変数を削除したい。
例えば、 「&a=」「&c=0」「&e=」を削除して、「index?b=&d=1」のようにしたいのです。

ちなみに、これらの変数には数字(1桁)がくる場合と空白の場合があります。
正規表現が初めてなので、とりあえずやってみたのは一個一個削除することです。

$url = ereg_replace('\&a=[0-9]?','',$url);
$url = ereg_replace('\&c=[0-9]?','',$url);
$url = ereg_replace('\&e=[0-9]?','',$url);

一応これで成功はしたのですが、何せ初めてなのであっているかどうか分かりません。
それと、もし1回の変換で可能であればその方法も教えて下さい。
0527nobodyさん2005/07/21(木) 10:19:40ID:???
>>526
PHPは知らんのだけど、その例だと "a=" は消えないだろ。前に & ついてないし。

> もし1回の変換で可能であればその方法も教えて下さい。
もうちょっと条件を一般化してくれないと、できるかどうかは誰にも分からない。
0528nobodyさん2005/07/21(木) 10:41:27ID:???
>>527
フォームのGETで出されたURLから必要の無い変数を削除したいのです。
フォームは自分でいじれないので、URLを直接置換するしか方法が無くて。

先の例ですが、GETで渡されたURLで、最初にくる変数には確かに「&」がつかず「?」の次から始まりますね。
それで今ちょうど躓いてしまったところです。(例と実際のソースが異なるためミスってしまいました)

条件1
 ・英字の先頭には「&」もしくは「?」がくる。「?」は削除せず、「&」は削除
 ・「& or 無し」+「英字1文字」+「=」+「数字1文字 or 空白」を削除
 例: &c=

これともう一つ別件で
条件2
 ・英字の先頭には「&」もしくは「?」がくる。「?」は削除せず、「&」は削除
 ・「& or 無し」+「英字1文字」+「=」+「英数字の組み合わせ6文字」を削除
 例: ?c=ff00cc


わかりにくいかも知れませんが、精一杯説明したつもりです。
どうかヨロシクお願いします。
0529nobodyさん2005/07/21(木) 10:57:35ID:???
&?([a-zA-Z]=[a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9])|([a-zA-Z]?)

phpは知らんので繰り返し指定子とか使えるなら使えばよい
0530nobodyさん2005/07/21(木) 10:58:05ID:???
訂正

&?[a-zA-Z]=([a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9])|([a-zA-Z]?)
0531nobodyさん2005/07/21(木) 10:59:39ID:???
>>530
あー、なるほど!1文字ずつ指定していけばいいのか。
まとめてやろうとしたからダメだったっぽいです。

今後は繰り返し何タラとかも覚えていきます。ありがとうでした。
0532nobodyさん2005/07/21(木) 13:26:18ID:???
パズルとしては面白いかもしれんが、無理に正規表現の
置換でやろうとせずに一度ばらしてから組み立てた方が
見通しがいいと思うけどな。
0533nobodyさん2005/07/22(金) 11:54:34ID:kQk294zK
URLエンコードされた文字を正規表現で表すとどんなん?
0534nobodyさん2005/07/22(金) 12:35:18ID:???
>>533
>>1 の Perlメモでもどうぞ。
0535nobodyさん2005/07/22(金) 13:33:28ID:???
>>533
/\+|%[0-9A-Fa-f]{2}/
0536nobodyさん2005/07/22(金) 15:11:31ID:???
>>535
んー出来ない…。
0537nobodyさん2005/07/22(金) 15:22:08ID:???
http://www.google.co.jp/search?q=%E4%BC%9D%E8%AA%AC
↓
http://www.google.co.jp/%E4%BC%9D%E8%AA%AC/

にしてたいんだよなー。(ググルを例に取った)

RewriteRule ^/(%[0-9A-Fa-f]{2})+/ /q=$1

これでやってみたけど駄目だった。
助けてくれ。
0538nobodyさん2005/07/22(金) 15:46:20ID:???
試してないけど。
RewriteRule ^/(%[0-9A-Fa-f]{2}|\+|[0-9A-Za-z_.-])+/$ /search?q=$1
0539nobodyさん2005/07/22(金) 16:00:06ID:???
>>538
それも試しましたがダメでした。むー、原因が分からん。
でも試行錯誤しているうちに正規表現が楽しくなってきた。
0540nobodyさん2005/07/22(金) 16:43:02ID:???
>>537
それって、本当にマッチしてない?
正規表現の問題じゃなくて mod_rewrite 側で問題があるような希ガス。
0541nobodyさん2005/07/22(金) 17:20:52ID:???
だな。
まずは rewrite_log を出して確認してみるとか、
もっと緩いルール、例えば ^/(.+)/ /q=$1 あたりから始めてみるとか。
0542nobodyさん2005/07/22(金) 17:32:44ID:???
>>541
ですよねぇ。文法的には合ってるはずなんだけどなぁ。
ちなみに、半角英数ならちゃんと出来たんです。

http://www.google.co.jp/2ch+nobdy/
みたいなやつね。
0543nobodyさん2005/07/22(金) 19:59:19ID:Hy++Zfid
>>540
ギンギラギンにさりげなく さりげなく生きるだけさ〜♪
0544nobodyさん2005/07/23(土) 00:56:00ID:???
えーとURLエンコードで悩んでいるモノです。
自宅のApacheでログをみたところ、何やら文字化けを起こしているようです。

http://localhostp/%A5%CA%A5%A4%A5%AD/
↓
File does not exist: c:/public_html/・ハ・、・ュ/

%A5%CA%A5%A4%A5%AD が ・ハ・、・ュ と文字化けしてしまうようです。
原因分かりますか?
0545nobodyさん2005/07/23(土) 01:18:09ID:???
>>544
スレ違い。文字コードについて勉強しろ。
0546nobodyさん2005/07/23(土) 01:32:33ID:???
>>545
ごめん、ログファイルの文字コードが違っていただけで
エラーとは無関係でしたOrz
0547nobodyさん2005/07/23(土) 17:44:37ID:2bOgW3d1
aからz 0から9 それとアンダーバー使いたいときに

([0-9A-Za-z_]+)

って書いたらうごくんだけど、これって正しい書き方?
0548nobodyさん2005/07/23(土) 23:16:24ID:???
>>547
問題ない。
05495472005/07/23(土) 23:22:51ID:???
>>548

どうもありがとです。
0550nobodyさん2005/07/24(日) 01:10:29ID:???
あちこち捜したんですが、うちの詳説正規表現がなくなって、
どこに行ったかわかりません。スレ違いかも知れませんが、
ポインタだけでもお示しいただければ幸いです。
0551nobodyさん2005/07/24(日) 01:31:12ID:???
ふとんの間に挟まってる
0552nobodyさん2005/07/24(日) 12:09:04ID:???
>>551
真っ先に布団を捜したんですがありませんでした。
あれを家から持ち出すはずがないので、空き巣にでも
入られたんじゃないかと心配になってきました。
0553nobodyさん2005/07/24(日) 13:44:01ID:???
通な空巣だよな。
0554nobodyさん2005/07/24(日) 13:47:30ID:???
こないだケツ拭くのに使ったじゃんお前
0555nobodyさん2005/07/24(日) 15:49:03ID:vU2XL6go
>>550
おまいの心の中にしまってあるんだよ・・・
0556nobodyさん2005/07/24(日) 18:01:34ID:???
>>550
らくだ盆と一緒に枕カバーの中に入れたのを忘れたか?
最近妙に枕硬いな・・・って思わんか?
0557nobodyさん2005/07/24(日) 21:17:58ID:???
ラクダ本は預かった、返して欲しくば ttp://game10.2ch.net/test/read.cgi/mmosaloon/1122179577 まで来い
0558nobodyさん2005/07/24(日) 23:04:10ID:???
>>557
人質にするならふくろう本の方だと思われ(w
05595502005/07/25(月) 00:40:13ID:???
お騒がせしてすみません。ありました。トイレの棚の上に
置いてありました。トイレットペーパーなんかを置く棚です。
下痢の時とかトイレに本を持ち込むんでした。

>>554
あれは確か、Perlで作るCGI入ry

スレ汚し申し訳ありませんでした。「単語境界とは何か」
ということについて、これからじっくり考えてみます。
0560nobodyさん2005/07/25(月) 09:11:16ID:???
http://192.168.1.0/http://192.168.1.0/
普通こんな感じ
05615602005/07/25(月) 09:12:21ID:???
ごめ。
間違えた。
0562nobodyさん2005/07/27(水) 03:13:00ID:rvBHMPTm
phpのpregです。文字列を空白で分割して、空でない要素のみ
配列に格納します。

$array = preg_split("/\s/", $string, -1, PREG_SPLIT_NO_EMPTY);

この時、空白だけではなく

「英数字か記号1字で、前後が英数字でない文字」

も区切り文字として正規表現に加えたいんですが、どういう風に
書けばいいでしょう? お願いします。
0563nobodyさん2005/07/27(水) 13:59:47ID:???
/(?<=[^A-Za-z0-9])[\x00-\x7f](?=[^A-Za-z0-9])/ とか?

「英数字か記号1字で、前後が英数字でない文字」 だと記号は全部消える気がするんだけどいいのかしら。
"記号"は"文字"の中に含まれない、ってことかな?
05645622005/07/27(水) 15:16:57ID:???
>>563
すいません、説明がダメダメでした。英数字でも記号でも、
1字のみの場合は空白と同じ扱いにしたいということです。

$string = "This is a pen."; なら
Array ( [0] => This [1] => is [2] => pen. )

$string = "A to Z"; なら
Array ( [0] => to )

$string = "15 - 9"; なら
Array ( [0] => 15 )

$string = "YOMIURI ON-LINE"; なら
Array ( [0] => YOMIURI [1] => ON-LINE )

という具合です。なんだかよくわからなくなってきました。
0565nobodyさん2005/07/27(水) 16:12:52ID:???
えー。

/(?:^|\s+).(?:\s+|$)|\s+/

↑こういうのとは違う?
"A to Z" は [0] => to にならないよ。
05665622005/07/27(水) 17:14:16ID:???
>>565
ありがとうございます。えーと、先に挙げた例でうまくいかないのは
"A to Z"ではなく"15 - 9"が

Array ( [0] => 15 [1] => 9 )

となるわけですが、これって /(?:^|\s+).(?:\s+|$)|\s+/ の前の方の
表現で" - "がマッチして、残りの9はマッチしなくなるんですね?
"1 2 3 4 5"でやってみると

Array ( [0] => 2 [1] => 4 )

となります。こういう時ってどこで勉強したらいいんでしょうか?
なんかもう頭が泥沼です。
0567nobodyさん2005/07/27(水) 17:42:00ID:???
あ、そうか、正直すまんかった。

/(?:^|\s+|(?<=\s)).(?:\s+|$)|\s+/

でどうよ?
0568nobodyさん2005/07/27(水) 17:47:02ID:???
いや、こうか。

/(?:(?:^|\s+|(?<=\s)).(?:\s+|$)|\s+)+/

何度もスマン。
05695622005/07/27(水) 18:20:12ID:???
>>568
いえいえ、何度もありがとうございます。期待した通りの
結果が得られたのですが、表現がそこまで行くと私には
魔法の呪文としか理解できなくて、もしよろしければ少し
解説いただけませんでしょうか?

(?:...) が、グループ化、ということはわかったのですが、
(?<=\s)) というのは何でしょう? たびたび恐縮ですが
正解を教えてもらうだけでなく、表現の中身も理解して、
自分で解を導けるようになりたいです。お願いします。
0570nobodyさん2005/07/27(水) 19:59:22ID:???
> (?<=\s)
何て言うんだっけ、「前方一致言明」 とかだっけ。
文字列 (上の場合".(?:\s+|$)") の前に、"\s"があった場合、マッチする、ってやつ。
まあ、下記参考ー

[PHP マニュアル] -> [パターン構文]
http://php.s3.to/man/pcre.pattern.syntax.html#regexp.reference.assertions

[SMART]->[PERL]->[正規表現]
http://www.rfs.jp/sitebuilder/perl/02/09.html の [拡張構文]
05715622005/07/27(水) 22:39:51ID:???
>>570
ありがとうございます。ちゃんと勉強しないとダメですね。
知らないことばかりです。何度もお世話になりました。
0572nobodyさん2005/07/28(木) 11:40:06ID:???
,区切りデータで、データ内に,があった場合は\,のようにしています
さらに\,は\\,のようにしています

perlでこれを分割したいのですが、
,に一致して(\\)+,に一致しないものはどう書けばよいのでしょう
よろしくお願いします
0573nobodyさん2005/07/28(木) 11:45:32ID:???
/(?<!\\),/
0574nobodyさん2005/07/28(木) 11:50:38ID:???
早い対応、ありがとうございます
■ このスレッドは過去ログ倉庫に格納されています