waniwanisan
@waniwanisan

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

二つの正規表現から新しい正規表現を作りたい

解決したいこと

正規表現 - 正規表現 = 新しい正規表現を作りたい

例)
下に二つの正規表現を記述しています。
ひとつはすべての記号を受け付ける正規表現
もうひとつは「:」「」「-」「@」の記号のみを受け付ける正規表現
これらを組み合わせてすべての記号から4つの記号を差し引いたものすべてを受け付ける正規表現を作りたいのですが上手くいきません。
(例)+ ; * [ は使えるが 「:」「
」「-」「@」は使えない

var xxx = new RegExp(/[!"#$%&'()\*\+\-\.,\/:;<=>?@\[\\\]^_`{|}~]/g);
//すべての記号を受け付ける正規表現

var reg = new RegExp(/[:\_\-@]/g);
//「:」「_」「-」「@」の記号のみを受け付ける正規表現

自分で試したこと

0

2Answer

正直、その目的だけならば関数にして

const isOK = str => xxx.test(str) && !reg.test(str);

で十分かと思います。

それがダメであれば、正規表現同士の比較はできないので、
sourceの文字列操作をするしかないと思います。

0Like

Comments

  1. @waniwanisan

    Questioner

    比較演算子を用いることは理解していましたが上記のようにシンプルに記述できるとはびっくりです。一歩前進できました。
    ありがとうございます。

もうひとつは「:」「」「-」「@」の記号のみを受け付ける正規表現

この部分が変化する、という要件があるのだと推測しています。
記号の部分を文字列や配列として変数に入れそこから除外していく、というやり方はどうでしょうか?

let chars = '!"#$%&\'()\*\+\-\.,\/:;<=>?@\[\\\]^_`{|}~';

chars = chars.replace('@', ''); // @を除外

const regex = new RegExp('[' + chars + ']', 'g');

console.log(regex.test('*')); // true
console.log(regex.test('@')); // false
console.log(regex.test('a')); // false

new RegExp('ab+c') といった正規表現オブジェクトのコンストラクターは、実行時に正規表現をコンパイルします。正規表現パターンが変わることがわかっている場合や、パターンが不明でありユーザー入力など別のソースからパターンを取得する場合は、コンストラクター関数を使用してください。

0Like

Comments

  1. @waniwanisan

    Questioner

    ありがとうございます。
    上記のサイト参考にさせていただきます。

Your answer might help someone💌