5ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

正規表現道場

1 :nobodyさん:2007/01/11(木) 02:40:43 ID:uW7xEbZY
【正規表現道場の掟】

・言語不問

・質問も大歓迎。使用言語を書くのを忘れずに。

正規表現と関係ない話・質問は他スレへどうぞ。

2 :nobodyさん:2007/01/11(木) 03:10:51 ID:???
http://pc10.2ch.net/test/read.cgi/tech/1156413899/

終了

3 :1:2007/01/15(月) 00:57:08 ID:/DToo9Jn
勝手に終了すんなデブ
ここはここでやればいい
再開あげ

4 :nobodyさん:2007/01/15(月) 20:06:50 ID:???
>>2は道場破り?

5 :nobodyさん:2007/01/15(月) 22:01:26 ID:???
一年ぶりの復活をしたなら過去スレくらい書こうぜ('A`)

過去スレ
正規表現道場@2ch
 http://pc.2ch.net/test/read.cgi/php/996105815/
正規表現道場@2ch Part2
 http://pc5.2ch.net/test/read.cgi/php/1038146241/
正規表現道場@2ch Part3 s/煽り|荒らし/あぼーん/g
 http://pc5.2ch.net/test/read.cgi/php/1069245758/
正規表現道場@2ch Part4
 http://pc8.2ch.net/test/read.cgi/php/1105930285/


過去スレのテンプレにあった参考サイトたち
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://web.archive.org/web/20021219021503/http://www01.u-page.so-net.ne.jp/jc4/hiroyuki/rex_index.html
Regular Expression(Riue ちゃんの正規表現講座)
 http://www.sixnine.net/regexp/

ほとんどは↓のリンク集にまとまっています。
正規表現/文字コード最新リンク2005
 http://www2.famille.ne.jp/~akio1998/l_grep.html

6 :nobodyさん: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さん: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さん: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: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さん:2007/01/22(月) 00:49:01 ID:???
ちょっといいかな。
>>12 の結果に疑問はないのだけど、

>>7
> preg_match('"^(/(?:[a-z]*))*$"', "//abca", &$m);
は空文字列にマッチで正解じゃないの?
だって、対象文字列には // と行頭に二つスラッシュが並んでいるけど、
正規表現は ^/ と一個しかないよ?

後ろに $ が置かれちゃってるから、
//hogehoge というパターンには空以外マッチしようがないと思うんだけど
俺、何か勘違いしてる?


14 :nobodyさん: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 :()と(?:)の違い: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 :()と(?:)の違い: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:2007/01/22(月) 11:21:28 ID:???
>>14
ありがとう。指摘通り誤読していた。
拡張表記をみてわかったよ。

やっぱLarryは偉いな。

ところでかっこの内と外で繰り返し指定が
連続するパターンは組み合わせの爆発が
怖くて自分はできるなら使わないように
しているんだけど、みんなはそんなこと
気にしない?


18 :()と(?:)の違い:2007/01/22(月) 12:31:13 ID:???
>>17
DFAだからとりあえずえらいことにならないうちに停止するだろう、
とか自分では思い込んでるんですが、NFAなら延々とバックトラック
しながらはまり込むとかあるんですかね。

19 :10:2007/01/22(月) 21:04:29 ID:???
>>16
どうぞお使いください。
でも、phpのソースにpcreが同梱されてるようだけれど報告先ディストリでいいのかな…

20 :()と(?:)の違い:2007/01/22(月) 21:51:33 ID:???
>>19
ありがとうございます。
むしろ PHP のバージョンごとあげてもらえればと。
って、最新バージョンのソースに入ってるのか orz
ちょっと PHP のソース眺めながら思案してみます。

21 :20:2007/01/23(火) 00:05:58 ID:???
>>19
I've reported this issue to PHP bug report.
http://bugs.php.net/bug.php?id=40195
Complete report and examination results are in
http://geeklog.windy.cx/article.php/20070122224722545
I'm in my Linux box without Japanese environment :-p

22 :20: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さん: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さん:2007/01/23(火) 22:31:38 ID:???
すいません。別の方法で解決しました。

26 :nobodyさん:2007/02/01(木) 17:35:44 ID:???
http://pc10.2ch.net/test/read.cgi/tech/1156413899/

終了

27 :20:2007/02/14(水) 08:22:19 ID:???
[9 Feb 7:58pm UTC] nlopess@php.net
bundled pcre upgrade to version 7.0.

28 :nobodyさん:2007/02/17(土) 11:34:20 ID:???
PHPで正規表現
http://www.pahoo.org/e-soul/webtech/php05/


29 :nobodyさん:2007/02/18(日) 02:46:46 ID:???
マルチで宣伝か?


30 :nobodyさん:2007/02/20(火) 02:12:09 ID:???
質問よろしくお願いします

ABCと続く場合を除くABという文字列を指定したい場合は
どのように書いたらよいでしょうか・・・

31 :nobodyさん:2007/02/20(火) 02:21:35 ID:???
正規表現ってどんなメリットあるの?
覚えなくても良いんでしょ?
よく、書く行数が減る⇒デバッグの時に楽って言うけど、
ロジック設計を完璧にするほうが大事じゃないかなーなどと思ってしまいます(ドシロウトですが)
そんなのとうに完璧って人がチャレンジすることなんですかねー

32 :nobodyさん:2007/02/20(火) 02:23:50 ID:???
>>30
Rubyでは(おそらくPerlやPHPのpreg_*系でも)
AB(?!C)


33 :nobodyさん:2007/02/20(火) 02:26:48 ID:???
>>31
文字列のパターンを記述するために特化した言語なので、
覚えれば非常に楽ができる。
ロジックで100行とか費やすようなパターンを、
正規表現では1行で表すことも可能(かもしれない)。

覚えなくてもいいが、覚えた方がはるかに楽ができるよ。

34 :nobodyさん:2007/02/20(火) 07:20:03 ID:???
>>31
ロジック組めないやつが楽をするためだよ
文字列から数字の部分だけ抜き出して表示とか正規表現なら簡単に出来るが
使わないでやれとかいわれたら時間がかかる。おまけにバグる。


35 :nobodyさん:2007/02/20(火) 08:24:42 ID:???
数字だけ抜き出すのが何かものすごい魔法のような技術のように思っているらしいw

36 :nobodyさん:2007/02/20(火) 08:27:41 ID:???
あるいは「おれってすげえ気の利いたこと言った?」とか思ってるのかなwww

37 :nobodyさん:2007/02/20(火) 08:35:59 ID:???
【心の】旦那には絶対言えない過去4【奥に】既婚女性板
http://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さん:2007/02/20(火) 19:38:28 ID:???
>>1
>使用言語を書くのを忘れずに。

くらいは守ってくれ。処理系によって正規表現は千差万別だからな。

40 :nobodyさん:2007/02/20(火) 19:56:10 ID:???
エスパー見習いの漏れが使用言語は Perl と推測。
バックスラッシュを前置してエスケープする。
/\/tatakanamk\//

41 :nobodyさん:2007/02/20(火) 22:52:27 ID:???
>>32
ありがとうございました!

42 :nobodyさん:2007/02/21(水) 02:10:45 ID:???
>>40
m{/tatakanamk/} みたいにやたらとエスケープ連発しないですむ方法を教えろよ… 


43 :nobodyさん:2007/02/21(水) 03:35:33 ID:???
エスケープを知らないのも問題だから両方教えるべきだとおも

44 :40:2007/02/21(水) 10:00:30 ID:???
だってもし他の言語だったとしても応用が一番効きそうじゃん。

と言い訳。

45 :42:2007/02/22(木) 01:40:37 ID:???
>>43
そりゃ確かにそうだね。
必要のないところまでエスケープしているような正規表現見てると
腹が立ってくるんだよw

>>44
わかった、わかったw


16 KB
■ このスレッドは過去ログ倉庫に格納されています

★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.04.00 2017/10/04 Walang Kapalit ★
FOX ★ DSO(Dynamic Shared Object)