2

これらの入力を次の出力に変換するJavascript RegExコマンドを考え出そうとしています:

INPUT                      DESIRED OUTPUT
mydomain.com          -->  mydomain.com
foo.mydomain.com      -->  mydomain.com
dev.mydomain.com      -->  dev.mydomain.com
dev-foo.mydomain.com  -->  dev.mydomain.com

ルールは次のとおりです。

  • サブドメインが文字「dev」で始まる場合を除き、ドメインからサブドメインを削除します
  • サブドメインが「dev」で始まる場合、「dev.domain.com」を出力します
  • ドメインの最後に指定されたポートを保持する

私の正規表現のスキルは私を失敗させています。これは私がこれまでに持っているものです:

'mydomain.com'.replace(/^(dev)?(-.*)?(mydomain.com)/,'$1.$3'); 
// .mydomain.com

'foo.mydomain.com'.replace(/^(dev)?(-.*)?(mydomain.com)/,'$1.$3'); 
// foo.mydomain.com

'dev-foo.mydomain.com'.replace(/^(dev)?(-.*)?(mydomain.com)/,'$1.$3'); 
// dev.mydomain.com

'dev.mydomain.com'.replace(/^(dev)?(-.*)?(mydomain.com)/,'$1.$3'); 
// dev.mydomain.com

最初の 2 つは失敗し、最後の 2 つは機能します。助言がありますか?

これが機能するjavascriptですが、それを単一の正規表現置換コマンドに結合したいと考えていました。ドメインの最後に指定されたポートも保持したいことに注意してください。

var getHost = function () {
  var host = window.location.host;
  if (host.substring(0,3) === 'dev') {
    return host.replace(/^(dev)?(-.*)?(mydomain\.com.*)/,'$1.$3');
  }
  else {
    return 'mydomain.com';
  }
}
4

3 に答える 3

7

単一の正規表現で実行できることを示すためだけに:

'string'.replace(/(?:(^dev).*(\.)|^.*)(mydomain\.com)/, '$1$2$3');

作業例: http://jsfiddle.net/gz2tX/

内訳は次のとおりです。何かに一致するか、dev何か.に一致します。「dev」を含むパターンに一致する場合$1は、「dev」$2を含み、「.」を含みます。「dev」を含むパターンと一致しない場合は、空になります$1$2($3どちらの場合も「mydomain.com」が含まれます。)

したがって、それは可能ですが、複雑です。

私の推奨事項は、これよりも読みやすく保守しやすいものを作成することです。私の意見では、この行を理解するために費やした時間と労力は、1 行または 2 行のコードの長さを節約する価値はありません。

于 2013-02-26T02:50:45.423 に答える
2

関数を使用して、置換で JS をより細かく制御して値を変更できます。

var value = "dev-foo.mydomain.com".replace(/^(dev)?[^\.]+\./, function (match, p1) {
    return p1 ? p1 + '.' : '';
});
于 2013-02-26T02:26:27.417 に答える
1

何を求めているのかわかりにくい…

しかし...サンプルの入力/出力に基づいて、次のことができます:

  1. 最初の期間で入力を分割します。
  2. 最初の部分に「dev」という単語が含まれている場合は、「dev」に置き換えます。
  3. 最初の部分に単語 dev が含まれていない場合は、削除します。

それが実際に必要な場合は、正規表現は必要ありません。

function trimInput(s) {
    var n = s.indexOf('.');
    if (n === -1) {
        return s;
    }
    var head = s.substring(0, n);
    if (head.indexOf("dev") !== -1) {
        return "dev." + s.substring(n);
    }
    else {
        return s.substring(n);
    }
}

それが望ましくない場合は、質問を更新して、何が欲しいかを指定してください。

于 2013-02-26T02:10:46.613 に答える