1 名前:nobodyさん [2007/01/11(木) 02:40:43 ID:uW7xEbZY] 【正規表現道場の掟】 ・言語不問 ・質問も大歓迎。使用言語を書くのを忘れずに。 正規表現と関係ない話・質問は他スレへどうぞ。
2 名前:nobodyさん mailto:sage [2007/01/11(木) 03:10:51 ID:???] pc10.2ch.net/test/read.cgi/tech/1156413899/ 終了
3 名前:1 [2007/01/15(月) 00:57:08 ID:/DToo9Jn] 勝手に終了すんなデブ ここはここでやればいい 再開あげ
4 名前:nobodyさん mailto:age [2007/01/15(月) 20:06:50 ID:???] >>2 は道場破り?
5 名前:nobodyさん mailto:age [2007/01/15(月) 22:01:26 ID:???] 一年ぶりの復活をしたなら過去スレくらい書こうぜ('A`) 過去スレ 正規表現道場@2ch pc.2ch.net/test/read.cgi/php/996105815/ 正規表現道場@2ch Part2 pc5.2ch.net/test/read.cgi/php/1038146241/ 正規表現道場@2ch Part3 s/煽り|荒らし/あぼーん/g pc5.2ch.net/test/read.cgi/php/1069245758/ 正規表現道場@2ch Part4 pc8.2ch.net/test/read.cgi/php/1105930285/ 過去スレのテンプレにあった参考サイトたち Perlメモ www.din.or.jp/~ohzaki/perl.htm 正規表現メモ www.kt.rim.or.jp/~kbk/regex/regex.html Regex::Diagram.pm www.cc.rim.or.jp/~midorin/mad-p/RegexDiagram.html 正規表現 www.cc.rim.or.jp/~midorin/mad-p/perl/benkyou/PRC2kRegex/ UNIX正規表現入門 web.archive.org/web/20021219021503/http://www01.u-page.so-net.ne.jp/jc4/hiroyuki/rex_index.html Regular Expression(Riue ちゃんの正規表現講座) www.sixnine.net/regexp/ ほとんどは↓のリンク集にまとまっています。 正規表現/文字コード最新リンク2005 www2.famille.ne.jp/~akio1998/l_grep.html
6 名前:nobodyさん mailto:age [2007/01/16(火) 02:57:15 ID:???] >>5 ご苦労様です
7 名前:()と(?:)の違い [2007/01/21(日) 14:23:29 ID:HARdTCVv] 対象文字列 //abca 正規表現 ^(/([a-z]*))*$ → マッチ 正規表現 ^(/(?:[a-z]*))*$ → マッチしない 後方参照を許す括弧かそうでないかで結果が違うのはなぜでしょうか? 処理系は PHP 5.2.0-8、OS は Debian GNU/Linux etch 使用した関数は preg_match() です。 具体的には preg_match('"^(/(?:[a-z]*))*$"', "//abca", &$m); var_dump($m); とすると $m[0] が空文字列になります。 すなわちマッチしません。
8 名前:nobodyさん mailto:sage [2007/01/21(日) 15:16:09 ID:???] >>7 preg_matchに与える正規表現は/で括る必要があるけど、原因はそれじゃない? 正規表現reをpreg_matchに与えるときは preg_match("/re/", $baka); とかやるんだけども。
9 名前:()と(?:)の違い [2007/01/21(日) 15:25:20 ID:HARdTCVv] >>8 いちおう '@^(/(?:[a-z]*))*$@' などとして区切り文字を @ にするなど気をつけているのですが・・・ ()と(?:)により挙動が違うというのが解せません・・・ もう少し実験してみます。ereg 系で試すとまた 結果が違ってくるかも知れないので。
10 名前:nobodyさん mailto:sage [2007/01/21(日) 20:27:33 ID:???] これは…PCREのバグを踏んじゃった可能性が結構高そうな… echo preg_match('{^(?:/(?:[a-z]*))*$}', "//abca"); => 0 Perl互換正規表現と言うくらいなのでPerlとの比較をしてみても勿論このとおり $ perl -e 'print scalar "//abca" =~ m{^(?:/(?:[a-z]*))*$};' => 1 後で念のためPCRE直接叩いてみよう
11 名前:()と(?:)の違い [2007/01/21(日) 21:20:40 ID:HARdTCVv] >>10 ふぅむ、バグの可能性もあるんですか〜 //abca じゃなくて /abca/abca とかならマッチするんですよね。 実はパスをディレクトリに分解しようとおもいまして、 その途中に // が入っているようなケースで挙動がおかしいので調べてました。 //abcde は / と /abcde に分解したかったんです。
12 名前:10 mailto:sage [2007/01/21(日) 23:05:47 ID:???] ふう、PCRE付属のpcretestでバージョン別検証。 [PCRE version 6.6 06-Feb-2006] re> /^(?:a(?:b*))*$/ data> aa 0: aa [PCRE version 6.7 04-Jul-2006] re> /^(?:a(?:b*))*$/ data> aa No match [PCRE version 7.0 18-Dec-2006] re> /^(?:a(?:b*))*$/ data> aa 0: aa ver6.7のみ上手くマッチしないと言う結果になった。 changelogの7.0をみてもそれっぽいのが見つけられないけれど、38辺りかなぁ… ちなみにPHPで使ってるPCREのバージョンは、 phpinfoのpcreのPCRE Library Versionで確認できる
13 名前:nobodyさん mailto:sage [2007/01/22(月) 00:49:01 ID:???] ちょっといいかな。 >>12 の結果に疑問はないのだけど、 >>7 の > preg_match('"^(/(?:[a-z]*))*$"', "//abca", &$m); は空文字列にマッチで正解じゃないの? だって、対象文字列には // と行頭に二つスラッシュが並んでいるけど、 正規表現は ^/ と一個しかないよ? 後ろに $ が置かれちゃってるから、 //hogehoge というパターンには空以外マッチしようがないと思うんだけど 俺、何か勘違いしてる?
14 名前:nobodyさん mailto:sage [2007/01/22(月) 01:56:13 ID:???] >>13 多分、中のアルファベットに対する量指定子を考慮に入れてないんでないかい? ^ # 文字列の最初 ( /(?:[a-z]*) # /の後に[a-z]が0文字以上 )* # の0回以上繰り返し $ # 文字列(行)の最後 //abcaは、<スラッシュ、[a-z]が"0文字"、スラッシュ、[a-z]が4文字>となってマッチしなければならない。はず。 >>11 その目的だとpreg_matchじゃ駄目だと思う。 一個目のキャプチャが繰り返しを全て記録することを期待したんだと思うが、毎回上書きされてしまう。 パス文字列が妥当なものかをマッチングで検証するためにpreg_matchを用いて、 実際の切り分けはexplode等を使ったほうがいいんじゃないかな。スレ違いになるが。 マッチングで切り分けるとするならpreg_match_allを用いて preg_match_all('{\G/[a-z]*}', "//abca", $m) といった感じか
15 名前:()と(?:)の違い mailto:sage [2007/01/22(月) 04:08:40 ID:???] >>12 ビンゴのようです。 手元の二つのLinuxマシンで試してみました。 preg_match('"^(/(?:[a-z]*))*$"', "//abca", &$m); Debian GNU/Linux etch PHP 5.2.0-8 PCRE 6.7 04-Jul-2006 マッチしない。 Fedora Core 4 PHP 5.1.6 PCRE 6.3 15-Aug-2005 マッチする。
16 名前:()と(?:)の違い mailto:sage [2007/01/22(月) 07:00:19 ID:???] >>12 TurboLinux Server 8.0 (Viper) での挙動も調べてみました。 preg_match('"^(/(?:[a-z]*))*$"', "//abca", &$m); preg_match('"^(/(?:[a-z]*))*$"', "/a/abca", &$m); いずれもマッチします。 PHP 4.2.3 PCRE 3.4 22-Aug-2000 です。 やはり Debian GNU/Linux etch の PHP5 5.2.0-8 だけが PCRE 6.7 04-Jul-2006 を使っていて挙動が変みたいなんで、 Debian GNU/Linux の BTS (バグ報告)に挙げようとおもうんですが、 >>12 の結果も引用させてもらって構いませんでしょうか?
17 名前:13 mailto:sage [2007/01/22(月) 11:21:28 ID:???] >>14 ありがとう。指摘通り誤読していた。 拡張表記をみてわかったよ。 やっぱLarryは偉いな。 ところでかっこの内と外で繰り返し指定が 連続するパターンは組み合わせの爆発が 怖くて自分はできるなら使わないように しているんだけど、みんなはそんなこと 気にしない?
18 名前:()と(?:)の違い mailto:sage [2007/01/22(月) 12:31:13 ID:???] >>17 DFAだからとりあえずえらいことにならないうちに停止するだろう、 とか自分では思い込んでるんですが、NFAなら延々とバックトラック しながらはまり込むとかあるんですかね。
19 名前:10 mailto:sage [2007/01/22(月) 21:04:29 ID:???] >>16 どうぞお使いください。 でも、phpのソースにpcreが同梱されてるようだけれど報告先ディストリでいいのかな…
20 名前:()と(?:)の違い mailto:sage [2007/01/22(月) 21:51:33 ID:???] >>19 ありがとうございます。 むしろ PHP のバージョンごとあげてもらえればと。 って、最新バージョンのソースに入ってるのか orz ちょっと PHP のソース眺めながら思案してみます。
21 名前:20 mailto:sage [2007/01/23(火) 00:05:58 ID:???] >>19 I've reported this issue to PHP bug report. bugs.php.net/bug.php?id=40195 Complete report and examination results are in geeklog.windy.cx/article.php/20070122224722545 I'm in my Linux box without Japanese environment :-p
22 名前:20 mailto:sage [2007/01/23(火) 07:47:35 ID:???] Nuno Lopes さんからリプライがあり、修正対象となりました。 [22 Jan 9:43pm UTC] nlopess@php.net I confirm this is a bug in pcre. so let's ask Andrei to upgrade PCRE to version 7, maybe for PHP 5.2.2 (assign back to me if you want me to do it).
23 名前:nobodyさん mailto:sage [2007/01/23(火) 17:36:48 ID:???] >>21-22 これは模範としたいバグ報告。乙です。
24 名前:nobodyさん [2007/01/23(火) 21:15:28 ID:EGIjqz4P] perl質問厨よろしくです。 @array = split(/(hoge(.))\2/, $line); この2番目の括弧だけ@arrayに含めないことはできますか? '----hoge11-----' ↓ ('----', 'hoge1', '-----') という風に取り出したいのです。
25 名前:nobodyさん mailto:sage [2007/01/23(火) 22:31:38 ID:???] すいません。別の方法で解決しました。
26 名前:nobodyさん mailto:sage [2007/02/01(木) 17:35:44 ID:???] pc10.2ch.net/test/read.cgi/tech/1156413899/ 終了
27 名前:20 mailto:sage [2007/02/14(水) 08:22:19 ID:???] [9 Feb 7:58pm UTC] nlopess@php.net bundled pcre upgrade to version 7.0.
28 名前:nobodyさん mailto:sage [2007/02/17(土) 11:34:20 ID:???] PHPで正規表現 www.pahoo.org/e-soul/webtech/php05/
29 名前:nobodyさん mailto:sage [2007/02/18(日) 02:46:46 ID:???] マルチで宣伝か?
30 名前:nobodyさん mailto:age [2007/02/20(火) 02:12:09 ID:???] 質問よろしくお願いします ABCと続く場合を除くABという文字列を指定したい場合は どのように書いたらよいでしょうか・・・
31 名前:nobodyさん mailto:sage [2007/02/20(火) 02:21:35 ID:???] 正規表現ってどんなメリットあるの? 覚えなくても良いんでしょ? よく、書く行数が減る⇒デバッグの時に楽って言うけど、 ロジック設計を完璧にするほうが大事じゃないかなーなどと思ってしまいます(ドシロウトですが) そんなのとうに完璧って人がチャレンジすることなんですかねー
32 名前:nobodyさん mailto:sage [2007/02/20(火) 02:23:50 ID:???] >>30 Rubyでは(おそらくPerlやPHPのpreg_*系でも) AB(?!C)
33 名前:nobodyさん mailto:sage [2007/02/20(火) 02:26:48 ID:???] >>31 文字列のパターンを記述するために特化した言語なので、 覚えれば非常に楽ができる。 ロジックで100行とか費やすようなパターンを、 正規表現では1行で表すことも可能(かもしれない)。 覚えなくてもいいが、覚えた方がはるかに楽ができるよ。
34 名前:nobodyさん mailto:sage [2007/02/20(火) 07:20:03 ID:???] >>31 ロジック組めないやつが楽をするためだよ 文字列から数字の部分だけ抜き出して表示とか正規表現なら簡単に出来るが 使わないでやれとかいわれたら時間がかかる。おまけにバグる。
35 名前:nobodyさん mailto:sage [2007/02/20(火) 08:24:42 ID:???] 数字だけ抜き出すのが何かものすごい魔法のような技術のように思っているらしいw
36 名前:nobodyさん mailto:sage [2007/02/20(火) 08:27:41 ID:???] あるいは「おれってすげえ気の利いたこと言った?」とか思ってるのかなwww
37 名前:nobodyさん mailto:sage [2007/02/20(火) 08:35:59 ID:???] 【心の】旦那には絶対言えない過去4【奥に】既婚女性板 human6.2ch.net/test/read.cgi/ms/1168957905/ 7 名前:可愛い奥様[] 投稿日:2007/01/18(木) 03:03:54 ID:iE8GVdnP 援交10回、中絶2回、デリヘル、ソープ1年、整形2か所 12 名前:可愛い奥様[] 投稿日:2007/01/19(金) 22:43:01 ID:s7dkuHKN0 高校生の頃から喫煙。不倫経験あり。 旦那は私にとって7人目の彼氏。(旦那には3人目と嘘ついた) 酒に酔った勢いでワンナイトラブの経験あり。 25 名前:可愛い奥様[] 投稿日:2007/01/26(金) 04:08:25 ID:IfNo5kNWO 中絶4回、イメクラ一年、二重整形、大学中退、性病2回、同棲3回。 45 名前:可愛い奥様[sage] 投稿日:2007/02/04(日) 14:24:40 ID:PBhJa6V+0 自分の預金が旦那の年収の7倍くらいあること。 学生のとき、ちょっとした事業起こして大成功w そのことも話してない。 47 名前:可愛い奥様[] 投稿日:2007/02/04(日) 17:16:59 ID:CaAW9Ko50 うーん。堕胎。母子手帳に記載しないといけないから…そこは糊で貼付けた。 義母にはバレているだろう。でも回数が…1回多いとは…永遠の秘密。 92 名前:可愛い奥様[] 投稿日:2007/02/09(金) 23:46:04 ID:QRXcETQYO セクキャバでバイト経験あり。援交しまくり時代もあり。ヤッた数は100人くらい。 私バツイチで今の旦那には元夫の浮気が原因で離婚したの。とか言ったけどほんとは逆。 好きな人できて夫捨ててのりかえた。浮気しまくりだった。 すごくいい夫だったのにすごく最低な事したって思う。 106 名前:可愛い奥様[] 投稿日:2007/02/18(日) 09:56:13 ID:wIf/65Md0 半年前、万引きして捕まった事。嘘泣きして逃がしてもらった(^^v
38 名前:nobodyさん [2007/02/20(火) 19:16:13 ID:W7lgDSO2] /tatakanamk/ と言う文字列があって/から/までの検出をするにはどう書けばよいでしょうか? /と/も含めて12文字を検出したいのです。 超初歩的ですがよろしくお願いします。
39 名前:nobodyさん mailto:sage [2007/02/20(火) 19:38:28 ID:???] >>1 の >使用言語を書くのを忘れずに。 くらいは守ってくれ。処理系によって正規表現は千差万別だからな。
40 名前:nobodyさん mailto:sage [2007/02/20(火) 19:56:10 ID:???] エスパー見習いの漏れが使用言語は Perl と推測。 バックスラッシュを前置してエスケープする。 /\/tatakanamk\//
41 名前:nobodyさん mailto:sage [2007/02/20(火) 22:52:27 ID:???] >>32 ありがとうございました!
42 名前:nobodyさん mailto:sage [2007/02/21(水) 02:10:45 ID:???] >>40 m{/tatakanamk/} みたいにやたらとエスケープ連発しないですむ方法を教えろよ…
43 名前:nobodyさん mailto:sage [2007/02/21(水) 03:35:33 ID:???] エスケープを知らないのも問題だから両方教えるべきだとおも
44 名前:40 mailto:sage [2007/02/21(水) 10:00:30 ID:???] だってもし他の言語だったとしても応用が一番効きそうじゃん。 と言い訳。
45 名前:42 mailto:sage [2007/02/22(木) 01:40:37 ID:???] >>43 そりゃ確かにそうだね。 必要のないところまでエスケープしているような正規表現見てると 腹が立ってくるんだよw >>44 わかった、わかったw
46 名前:nobodyさん mailto:sage [2007/03/02(金) 01:04:13 ID:???] 保守
47 名前:nobodyさん [2007/03/10(土) 16:03:45 ID:VXyj5Dh3] <? $str = "/get/data/&country=2&url=www.example.com/?url=http://www.example.com"; このデータの中ではじめの url= 以降の文字列を取得するにはどうすればいいのでしょうか?ちなみにurl=以降の文字列にも再度url=が含まれていますが、これを無視してすべて取得したいです。 どうぞよろしくお願いします。
48 名前:nobodyさん mailto:sage [2007/03/11(日) 04:44:19 ID:???] >>47 url=www.example.com/?url=http://www.example.com がとれりゃあいいのか? url=.*$ で何か不都合ある?
49 名前:nobodyさん [2007/03/12(月) 12:20:51 ID:DmSqMrCU] php使ってます。 文字列中の?を抽出するにはどう記述したらいいのでしょう? ¥? じゃだめなことはわかりましたorz
50 名前:nobodyさん mailto:sage [2007/03/12(月) 12:48:47 ID:???] バックスラッシュを前に置く。
51 名前:nobodyさん [2007/03/12(月) 14:27:04 ID:DmSqMrCU] ばっちですた!
52 名前:nobodyさん [2007/03/18(日) 21:25:07 ID:7HFdTRo7] 教えてください。 $in=ユーザーからの入力 $str='abc%ghi'; $str=preg_replace('/(\w+)%(\w+)/',"\1$in\2",$str); ユーザーからの入力を'def'にしておくと、abcdefghiになります。 ですがユーザーからの入力が'123'の場合、ghiになります。 たぶん、置換後の文字列が「\1123\2」と、繋がって解釈されているからだと思います。 {\1}のように囲むとか、なにか繋がらないように解釈してもらう方法はないですか? 二段階に分けて置換するとかすれば回避できなくはないですがスマートではなさそうなので。
53 名前:52 mailto:sage [2007/03/18(日) 21:25:46 ID:???] すいませんphp4です。
54 名前:nobodyさん mailto:sage [2007/03/18(日) 22:00:48 ID:???] こうしたらこうなるって結果を一行にまとめて
55 名前:nobodyさん mailto:sage [2007/03/19(月) 08:43:07 ID:???] >>52 "\\1" . $in . "\\2" "\\1{$in}\\2" というか普通に\\1と\1を間違えてるだけじゃない?
56 名前:52 mailto:sage [2007/03/20(火) 00:34:39 ID:???] >55 >普通に\\1と\1を すいません間違いでした。(ここに貼ったあと直しましたが動作変わらず。) そのうえ↓を書いてて解決しました。手間取らせてすいません。 $in='123'; $str=preg_replace('/(abc)%(def)/',"\\1$in\\2",$str); //これが $str=preg_replace('/(abc)%(def)/',"\\1123\\2",$str); //こうなってしまうので $str=preg_replace('/(abc)%(def)/',"def",$str); //\\1123はないので消えて\\2だけ置換され print $str; //defが出力される と思うので、{$in}でくくっても結果は同じでした。 一番いいのは\\1側を{\\1}くくる方法だと思うのですが。 →phpだと\\1は\$1でもいいので、"\${1}$in\$2"で解決しますた。ほんとすいません。
57 名前:nobodyさん [2007/03/23(金) 00:39:31 ID:P+rVOV8A] $str = "foo@=barfoo@=bar"; $str = preg_replace('/foo.*(=)bar/', "a\\1b", $str); を実行した場合の結果をa=ba=bにしたいのですが、 実際はa=bになってしまいます。 どこが間違っているのでしょうか?
58 名前:nobodyさん mailto:sage [2007/03/23(金) 02:15:09 ID:???] >>57 .* が何にマッチしているのか確かめてみ。
59 名前:57 [2007/03/23(金) 10:16:39 ID:P+rVOV8A] >>58 .*を bar と続く文字列以外の任意の文字列に変えればいいというのはわかるのですが、 $str = preg_replace('/foo[^(bar)]*(=)bar/', "a\\2b", $str); としてもうまくいきません。 エロイ人よろしくお願いします。
60 名前:nobodyさん mailto:sage [2007/03/23(金) 10:45:01 ID:???] 「ある文字列を含まない文字列」の正規表現はめんどいので最短マッチ .*? で。
61 名前:57 mailto:sage [2007/03/23(金) 16:57:03 ID:???] >>60 おお!それでできました。 ありがとうございます。
62 名前:nobodyさん mailto:sage [2007/03/24(土) 01:11:05 ID:???] >>59 foo[^(bar)]*(=)bar ブラケットの中とかどこでこんな書き方覚えてくるんだよ… 今回の場合、barまで見ないでも = までみりゃあいいんじゃないの? 不用意に最短マッチ使ってるとパフォーマンスで泣くよ? foo[^=]*=bar を a=b に置換でいいじゃん。 =をキャプチャするのも意図がわからん。
63 名前:nobodyさん [2007/03/24(土) 12:15:47 ID:yU007f6l] <html> <head> <title>テスト</title> </head> <body> <!-- ここから --> あああああああああああ<br /> あああああああああああ<br /> あああああああああああ<br /> あああああああああああ<br /> あああああああああああ <!-- ここまで --> </body> </html> このようなhtmlをPHP5のfile_get_contentsで読み込んで <!-- ここから -->〜<!-- ここまで -->を取得したいのですが どうすれば良いですか? "/<!-- ここから -->(.*)<!-- ここまで -->/" で読めませんでした
64 名前:nobodyさん mailto:sage [2007/03/24(土) 13:41:28 ID:???] >>62 > 不用意に最短マッチ使ってるとパフォーマンスで泣くよ? kwsk
65 名前:nobodyさん mailto:sage [2007/03/24(土) 16:11:22 ID:???] $text = file_get_contents(なんちゃらかんちゃら); mb_ereg("<!-- ここから -->(.*)<!-- ここまで -->", $text, $data); echo $data[1]; 改行に邪魔されてるんだろう
66 名前:nobodyさん mailto:sage [2007/03/25(日) 02:07:05 ID:???] >>65 その記述だとパターンの部分でエラーがでない?
67 名前:nobodyさん [2007/04/07(土) 00:58:14 ID:YCq54Nw2] 始めまして。 C#で、正規表現でyyyy/mm/dd書式をどう表現するのでしょうか? ちなみに、.NETの正規表現はPerl互換だそうです。
68 名前:nobodyさん mailto:sage [2007/04/07(土) 04:03:00 ID:???] >>67 Datteクラスかなんかに文字列食わせて、例外飛ぶかどうかで 判定したら? 正規表現でやると 9999年13月35日をうけつけてもいいってのなら \d{4}/\d{2}/\d{2} かな。 月と日は頑張ればなんとかできるけどめんどくさいからやらない。
69 名前:nobodyさん [2007/04/08(日) 02:12:40 ID:EVMLEL7f] >>68 ありがとうございます。 実は、正規表現Validatorを使っているのです。
70 名前:nobodyさん mailto:sage [2007/04/08(日) 16:37:48 ID:???] >>68 ああ、そういうことなのね。 一応注意しておくけど、C#の文字列のエスケープも\を使うので プログラムに書くときは "\\d{4}..." のように\を重ねるか、 @"\d{4}.." のような\が特別扱いされない形式にしてね。
71 名前:nobodyさん [2007/04/15(日) 02:12:22 ID:v7Ys668x] php5です。ファイルのフルパスをディレクトリ,ファイル名,拡張子に分割してその配列を返したくてこう書きました。 $pattern1 = '`^(.*)(?:[/\\\](.*)){1}$`'; preg_match($pattern1, $fullpath, $match1); $pos = strpos($match1[2], '.'); if($pos === false){ return array($match1[1], $match1[2]); }else{ $pattern2='`^(.*?)\.(.*)$`'; preg_match($pattern2, $match1[2], $match2); return array($match1[1], $match2[1], $match2[2]); } 必ず拡張子があるなら一度のpreg_matchでキャプチャ出来たのですが 拡張子無しファイル混じりだった場合の正規表現がうまく思いつかずに二段階(三段階?)になってしまいました でもpreg_matchやってその中で'.'探して、あったらさらにpreg_matchというのはまわりくどいように思います この処理を一度にこなす正規表現の考え方のヒントをください
72 名前:nobodyさん mailto:sage [2007/04/15(日) 02:14:51 ID:???] ああ半角空白の連続ダメなんだっけ インデント消えちゃた
73 名前:nobodyさん mailto:sage [2007/04/15(日) 03:03:32 ID:???] >>71 jp.php.net/manual/ja/function.dirname.php 及び関連項目を参照。
74 名前:73 mailto:sage [2007/04/15(日) 03:04:35 ID:???] あ、ごめん。正規表現スレだったね。無視して。
75 名前:73 mailto:sage [2007/04/15(日) 03:10:35 ID:???] で、考えてみたんだけど、 $path = '/abc/def.g/eee.txt'; preg_match('/(.*?)¥/([^¥/]*)¥.([^¥/.]*$)/', $path, $match); print_r($match); こんな感じでどう?
76 名前:73 mailto:sage [2007/04/15(日) 03:17:28 ID:???] これじゃ拡張子のない場合に対応できないか。 /(.*?)¥/([^¥/]*?)(¥.[^¥/.]*)?$/ でどうかな。スレを汚してしまってすまん。
77 名前:nobodyさん mailto:sage [2007/04/15(日) 09:05:07 ID:???] PHPなら、dirnameとbasenameつかえば正規表現なんか使う必要一切ないだろ
78 名前:nobodyさん mailto:sage [2007/04/15(日) 11:13:03 ID:???] >>77 >>73-74
79 名前:71 mailto:sage [2007/04/15(日) 11:28:41 ID:???] 正規表現無しだとこんな感じでした $p = pathinfo($fullpath); $temp = explode('.',$p['basename'],2); $p['name'] = $temp[0]; if(isset($temp[1])){ $p['ext'] = $temp[1]; } >>76 を参考にして正規表現で書けました $pattern = '`^(.*)[/\\\]([^.]*?)(?:\.(.*))?$`'; preg_match($pattern, $fullpath, $match); ありがとうございました
80 名前:nobodyさん [2007/05/03(木) 19:11:49 ID:meD6A7ah] phpで携帯電話の絵文字を取り除くようpreg_replaceを使っているのですが、 絵文字が複数含まれた文字列?などでうまく取り除けません。 こんな感じにしているのですが原因やおかしな点などご教示ください。お願いします。 $str = '絵文字が含まれる文字列'; $emojiSjisChars = '(?:[\x00-\x7F\xA1-\xDF]|(?:[\x81-\x9F\xE0-\xFC][\x40-\x7E\x80-\xFC]))'; #DoCoMoの場合 $str = preg_replace('/\G(' .$emojiSjisChars. '*?)(?:\xF8[\x9F-\xFC]|\xF9[\x40-\x49\x50-\x52\x55-\x57\x5B-\x5E\x72-\x7E\x80-\xB0])|(?:\xF9[\xB1-\xFC])/', '$1', $str); #AUの場合 $str = preg_replace('/\G(' .$emojiSjisChars. '*?)(?:[\xf3\xf6\xf7][\x40-\xfc]|\xf4[\x40-\x8d])/', '$1', $str); #Softbankの場合 $str = preg_replace('/\G(' .$emojiSjisChars. '*?)\x1B\x24[E-G].*?\x0F/', '$1', $str);
81 名前:80 [2007/05/03(木) 19:17:55 ID:meD6A7ah] すいません。↑の$emojiSjisCharsは$sjisCharsの命名間違えです。
82 名前:nobodyさん mailto:sage [2007/05/03(木) 19:26:15 ID:???] ちゃんと読んでないけど (?:絵文字のコード) な部分を (?:絵文字のコード)+ にするだけではないの?
83 名前:80 [2007/05/03(木) 20:24:41 ID:meD6A7ah] >>82 レスありがとうございます。 下のように+を入れましたがダメでした。 色々考えているとどんどん分からなくなってきました... おかしな点があれば引き続きご教示お願いします。 #DoCoMoの場合 ※見にくいので表示上改行します。 $str = preg_replace( '/\G(' .$emojiSjisChars.'*?) (?:\xF8[\x9F-\xFC]|\xF9[\x40-\x49\x50-\x52\x55-\x57\x5B-\x5E\x72-\x7E\x80-\xB0])+| (?:\xF9[\xB1-\xFC])+/', '$1', $str);
84 名前:nobodyさん mailto:sage [2007/05/04(金) 00:29:52 ID:???] オライリーの詳細正規表現の本って 通常のと第2版ってのがあるけどどっちがいいのよ?
85 名前:nobodyさん mailto:sage [2007/05/04(金) 03:16:56 ID:???] >>84 通常のって初版のことかい? そりゃあ新しい方が。 具体的にどう変わったか覚えてないのでオライリーのサイトを見たけど、 Perlの対象が5.8にあがっているのと、.JAVAとNETの説明が増えたとからしい。
86 名前:nobodyさん mailto:sage [2007/05/10(木) 19:57:43 ID:???] php4.3.11です --------------------------------- $str = <<< DOC_END あああああ いいいいい <html_start> ううううう えええええ <html_end> おおおおお DOC_END; $pattern = "/<html_start>(.*)<html_end>/"; $replacement = 'aaaabbbb'; $res = preg_replace($pattern, $replacement, $str); print_r($res); --------------------------------- と出力してみましたが何も表示されませんでした。 ホントは「あああああいいいいいaaaabbbbおおおおお」と出て欲しかったのですが…。 最終的には<html_start><html_end>で囲まれた範囲に PHPのhtmlspecialchars()やnl2br()関数を適用して出力したいです。
87 名前:nobodyさん mailto:sage [2007/05/10(木) 20:35:51 ID:???] >>86 > $pattern = "/<html_start>(.*)<html_end>/"; 「 ^ や $ があるってことは正規表現って行単位?複数行の場合は?」とか思いながら $pattern = "/<html_start>(.*)<html_end>/s"; にして試す。で、「s って何だよ、こんにゃろ」と思いながらマニュアルの「パターン修飾子」のとこを読む。 うちのPHP5さんでは元のコードでも「何も表示されない」にはならなかったな。 ブラウザ出力: あああああいいいいい うううううえええええ おおおおお ソース: print_r($str) な感じ
88 名前:nobodyさん mailto:sage [2007/05/10(木) 20:51:04 ID:???] >>87 s修飾子で動作しました!ありがとうございます。 >「s って何だよ、こんにゃろ」と思いながらマニュアルの「パターン修飾子」のとこを読む。 関数のページばかりみて jp.php.net/manual/ja/ref.pcre.php jp.php.net/manual/ja/reference.pcre.pattern.modifiers.php のページの存在に気がつきませんでした…。 あとは関数を適用する方法を探してみますっ!
89 名前:nobodyさん mailto:sage [2007/05/10(木) 21:18:19 ID:???] 案外この手の質問したい人もいるんだね
90 名前:86 mailto:sage [2007/05/14(月) 15:45:03 ID:???] 後方置換する時に関数かましたくマニュアル眺めてたら「e修飾子」をみつけたのですが >>87 の「S修飾子」と同時に使おうと $pattern = "/(.*?)<html_start>(.*)<html_end>(.*?)/se"; $replacement = "'\\2''\\1''\\3'"; こんなコードを書いてみた所 Parse error: syntax error, unexpected T_CONSTANT_ENCAPSED_STRING Failed evaluating code: といった感じで怒られます 修飾子2個は同時に使えないのでしょうか…?
91 名前:86 mailto:sage [2007/05/14(月) 17:55:10 ID:???] >>86 ですが 自分で見返してたらこれは既に正規表現でなくPHPの質問な気がしてきましたので該当スレに 移動しますです。 スレ違、申し訳ありませんでした。
92 名前:nobodyさん mailto:age [2007/05/17(木) 13:08:20 ID:???] IPを正規表現でチェックしたいのですが 210.000.111.1〜210.000.111.255 215.100.000.1〜215.100.000.255 の2つに当てはまる場合、TRUE(int1)をかえすにはどうすればいいでしょうか? 以下のようにやってみたのですが他のIPでもint(1)がかえってきます。 preg_match('/^210\.000\.111\.([0-9]{2}|1[0-9]{2}|2[0-4][0-9]|25[0-5])$ || ^215\.100\.000\.([0-9]{2}|1[0-9]{2}|2[0-4][0-9]|25[0-5])$/', $_SERVER['REMOTE_ADDR'])
93 名前:nobodyさん mailto:sage [2007/05/17(木) 13:53:20 ID:???] >>92 正規表現で foo || bar みたいなのはないっしょ。 /^(210...(中略)...|215...(中略)...)$/ みたいな。 アドレスの範囲のチェックをするなら正規表現使わない方が良いと思うけどね。
94 名前:おながいします [2007/06/06(水) 13:28:10 ID:iKhV2zih] すみませんが、価格にマッチする正規表現を教えていただけないでしょうか。 例 \1,000,000,000 \12,345 \1,230 \200 \10 数字3つごとに、カンマが入り、先頭に円マーク(\)のくるものです。 判らないためググッたのですが、正規表現に関する本ばかり検索結果として出てきまして…。
95 名前:おながいします [2007/06/06(水) 13:29:35 ID:iKhV2zih] 上の>>94 ですが、使用言語はPHPです。
96 名前:nobodyさん mailto:sage [2007/06/06(水) 13:41:59 ID:???] それは、「\12,1232,32」みたいなのははじきたいの?
97 名前:nobodyさん mailto:sage [2007/06/06(水) 13:49:54 ID:???] 「正規表現 カンマ」とかでぐぐってみると・・・
98 名前:nobodyさん mailto:sage [2007/06/06(水) 14:54:17 ID:???] >>98 穴だらけだけどこんなんのこと? $hoge = "\1,000"; if(ereg(".*[0-9,\\]",$hoge)): echo "ok"; else: echo "ng"; endif;
99 名前:nobodyさん mailto:sage [2007/06/06(水) 15:08:26 ID:???] >>98 つ[ www.google.co.jp/search?hl=ja&q=%E9%87%91%E9%A1%8D%E3%80%80%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%8F%BE&lr= ]
100 名前:94 mailto:sage [2007/06/06(水) 17:22:28 ID:???] >>96 >>97 >>98 >>99 皆様、ありがとう御座いました。 「価格 正規表現」、「値段 正規表現」でググってました(汗)
101 名前:nobodyさん mailto:sage [2007/06/30(土) 13:42:20 ID:???] (?:pattern),および(?>=pattern)が認識されないエディタにおいて、 $obj->method();の「method」のみにマッチさせるにはどうすればいいでしょうか。 ちなみに(?=pattern)は使えます。
102 名前:nobodyさん [2007/07/09(月) 23:51:58 ID:jN4+J6ks] VB.NETで正規表現を書いています。 条件としては、「A0123」のように、先頭がアルファベットのAでその他が数字4桁という正規表現と、 「01234」のような数字5桁という二種類のどちらかにマッチする正規表現を作っています。 正規表現は苦手で困っています。 どなたかご教授下さい。 よろしくお願いします。