From: Hiroshi Nakamura Date: 2011-09-23T15:37:34+09:00 Subject: [ruby-list:48387] Re: splitの正規表現を改善したい -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 (2011年9月23日 14:38:27), masayoshi takahashi wrote: >>> str = "{abcabcabcabcabcabcabcabcabcabc" words = >>> str.split(/(\{(?:[^\}\\]+|\\.)*?\})/, -1) p words >>> >>> 正規表現の書き方がよくないと思うのですが、どう書くと効率的に 実行できるのでしょうか。 >> >> +や*のネストはマッチに失敗したときに大量のトラックバックを発生さ せます。この場合は+をなくせばいいはずです。 > > おおお、確かに+が不要でした! 修正したところ、これで問題なさそうです。どうもありがとうございました。 ちょっと今手元に「詳説 正規表現」がないので理屈がいえないのですが(つ まり身についてない)、エスケープ時のパターンとしては /\{(?:[^\}\\]+(?:\\.[^\}\\]*)*)\}/ だったはずです。 pat = [^区切り文字\\] として、 pat+(\\.pat*)*区切り文字 最初のpat+で食えるだけ食っとくとお得、というのは変わりませんが。 みんながハマる、そして覚えると便利なイディオムなので、なんか専用メソッ ドにしたほうがいいんだろうなあと思いつつ。 -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.9 (Cygwin) iQEcBAEBAgAGBQJOfCj/AAoJEC7N6P3yLbI2+SoIAK91ZLVwxdDFL9lEc8vwuu73 JPZ/zHWOByDptNuCOsx0H+zUnSxvK3hd/VcVs6GvTA/LllxQ1F3scrYukn3+bDub Ztt2XvwScSxiY2OjAHQocdRCGm3KehkYFMi4pzIdgEAr33hx1iqJ0uTxptivWJUk 4NMN5GHh8as1yx2sZS+FFuzdWYc0P86V9ZOd1xnro4Ahotsn4jkDPvnQxnIfzaO4 hQEo+StR5oFLoAM7rkf7jOFTE71AzIcve+M4hT4axkr/QNx6KpOWUTi4iJvd0Jz6 V497Y+EVImhhLHjXWM+V/sTMBCafMd9eB06vhqZsDfLSrLW0QXXwUsVKXftfRQ0= =fLIP -----END PGP SIGNATURE-----