1. ホーム
  2. javascript

[解決済み] JavaScriptで長い正規表現を複数行に分割する方法は?

2022-04-24 02:39:50

質問

私は非常に長い正規表現を持っています。私はJSLintのルールに従って、各行の長さを80文字に保つために私のJavaScriptコードで複数の行に分割したいです。その方が読みやすいと思うからです。 以下はパターン例です。

var pattern = /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;

解決方法は?

文字列に変換し、式を作成するために new RegExp() :

var myRE = new RegExp (['^(([^<>()[\]\\.,;:\\s@\"]+(\\.[^<>(),[\]\\.,;:\\s@\"]+)*)',
                        '|(\\".+\\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.',
                        '[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\\.)+',
                        '[a-zA-Z]{2,}))$'].join(''));

注意事項

  1. を変換する際に 表現リテラル を評価する際にバックスラッシュが消費されるため、すべてのバックスラッシュをエスケープする必要があります。 文字列リテラル . (詳しくはKayoさんのコメントをご覧ください)。
  2. RegExp は、2 番目のパラメータとしてモディファイアを受け付けます。

    /regex/g => new RegExp('regex', 'g')

[ ES20xxの追加 (タグ付けされたテンプレート)] を参照してください。

ES20xxでは タグ付きテンプレート . スニペットをご覧ください。

注意してください。

  • この場合の欠点は、正規表現の文字列に空白を使うことができないことです(常に \s , \s+ , \s{1,x} , \t , \n など)があります。

(() => {
  const createRegExp = (str, opts) => 
    new RegExp(str.raw[0].replace(/\s/gm, ""), opts || "");
  const yourRE = createRegExp`
    ^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|
    (\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|
    (([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$`;
  console.log(yourRE);
  const anotherLongRE = createRegExp`
    (\byyyy\b)|(\bm\b)|(\bd\b)|(\bh\b)|(\bmi\b)|(\bs\b)|(\bms\b)|
    (\bwd\b)|(\bmm\b)|(\bdd\b)|(\bhh\b)|(\bMI\b)|(\bS\b)|(\bMS\b)|
    (\bM\b)|(\bMM\b)|(\bdow\b)|(\bDOW\b)
    ${"gi"}`;
  console.log(anotherLongRE);
})();