javascriptのswitch文で正規表現
ぐぐると沢山でてくるけど、
俺が求めているのはこれじゃない。
正規表現onlyなcaseならこれでいいが
url='http://example.com/info.php'; with(url.compare){switch(url){ case 'http://example.com/': console.log('完全一致') break; case startsWith('http://sample.com/'): console.log('前方一致'); break; case endsWith('http://sample.com/'): console.log('後方一致'); break; case includes('http://sample.com/'): console.log('部分一致'); break; case match(/.php$/): console.log('正規表現'); break; }}
のように通常のcaseと一緒に正規表現やstartsWithとかの関数も合わせて使いたい。
- Stringのプロパティに以下のようにcompareプロパティを追加すれば上のように書ける
Object.defineProperty( String.prototype, 'compare', { get: function () { for(var method of ['startsWith','endsWith','includes','match']){ if(!this['_'+method]) this['_'+method] = this[method]; this[method] = (x) => this['_'+method](x) && this+''; } return this; } });
Stringのプロパティを予め設定しておく必要があるが参考までに
ちなみにswitch文は上から順番に処理されるため
比較条件を、完全一致 ⇒ 前方一致・後方一致 ⇒ 部分一致の順で並べないとちゃんと処理できない。
正規表現は、完全一致 のあとに入れる。ただし、正規表現式の内容によって
前方一致、後方一致、部分一致の順番は入れ替える必要がある。
残り
case /.php$/:
に変えたい
/正規表現/
は実はRegExpオブジェクトの省略形なので、ここのスコープだけRegExpの動作をswitchに入れる変数をデフォルトで入力させるようにできれば行けそうだけど、そのRegExpオブジェクトの省略形は書き換えが無理そう。というか、出来たとしてもその前処理が大変になりそうなので、これ以上は無理かな
javascriptではphpのマジックメソッド的な__callのようなものはないので、正直めんどうそう
追記
__noSuchMethod__というのがあったが廃止されている。
代わりにproxyというのがあるが、色々できる分 かなり難解
これでシュミレート可能