正規表現で文字列を検索する前に、文字列で文字列を検索する下記のコードを学びましょう。
[https://paiza.io/projects/qoPQ_ElYaGfDPoaE9_MLpQ?language=javascript コード例]:
const str = "books";
[..."abcdefghijklmnopqrstuvwxyz"].forEach(ch => {
    const index = str.search(ch);
    console.log(`'${ch}'は、`,~index ? `${index + 1}文字目にあります。` : "ありません。");
})
実行結果:
'a'は、 ありません。
'b'は、 1文字目にあります。
'c'は、 ありません。
'd'は、 ありません。
'e'は、 ありません。
'f'は、 ありません。
'g'は、 ありません。
'h'は、 ありません。
'i'は、 ありません。
'j'は、 ありません。
'k'は、 4文字目にあります。
'l'は、 ありません。
'm'は、 ありません。
'n'は、 ありません。
'o'は、 2文字目にあります。
'p'は、 ありません。
'q'は、 ありません。
'r'は、 ありません。
's'は、 5文字目にあります。
't'は、 ありません。
'u'は、 ありません。
'v'は、 ありません。
'w'は、 ありません。
'x'は、 ありません。
'y'は、 ありません。 
'z'は、 ありません。
JavaScriptでは、まず文字列オブジェクトのsearch関数によって、探す文字列が何文字めに出現するかを返します。search関数は先頭の文字を0文字目として数えるため、上記コードでは +1 しています。
文字が見つからなかった場合、searchメソッドは -1 を返します。
~indexは -1 と比較するイディオムで、-1 だったときだけ false になります。
[https://paiza.io/projects/_0kWgfM77z0lRmYjhbu5Fw?language=javascript コード例]:
const str = "books";
const regex = /k/;
if (regex.test(str)) {
    console.log("含まれます。");
} else {
    console.log("含まれません。");
}
実行結果:
含まれます。
正規表現とは、上記のコードの「/k/」の部分です。JavaScriptでは正規表現リテラルをスラッシュではじめ、スラッシュで終わらせます。フラグを用いる場合は、末尾のスラッシュに続けて記述します。
まず、フラグを何も指定しない場合、大文字と小文字が区別されることを確認しましょう。
コード例:
const str = "books";
const regex = /K/;
if(regex.test(str)) {
  console.log("含まれます。");
}
else {
  console.log("含まれません。");
}
実行結果:
 含まれません。
フラグ無しでは大文字と小文字は区別されます。
コード例
const aaa = "books";
const s = /K/i ;
if( s.test(aaa) ) {
  document.write("含まれます。");
}
else {
  document.write("含まれません。");
}
結果
 含まれます。
フラグを追加することで、大文字と小文字は区別されなくなります。
正規表現で
 \p{Unicode プロパティエスケープ}
の形式でUnicode プロパティエスケープに基づくパターンマッチングが出来るようになりました。
const str = '絵文字はUNICODEに大々的に取り入れられたけれどサロゲートペアなのはきつい👿';
const emoji = /\p{Emoji_Presentation}/gu;
console.log(str.match(emoji)); // ["👿"]
正規表現で
 (?pattern)
の形式で名前付きキャプチャグループが使えるようになりました。
 $
の形式で置き換え対象で参照出来ます。
const str = '今日昨日明日';
const today = /(?今日)/gu;
console.log(str.replace(today, "$（きょう）")); // 昨日今日（きょう）明日
JavaScriptの正規表現オブジェクトの実体はRegExpオブジェクトのインスタンスです。RegExpオブジェクトのコンストラクタは第一引数に正規表現、第二引数にフラグを受け取ります。
第一引数の正規表現に\dや\sなどのメタ文字が含まれる場合は、バックスラッシュが文字列リテラルのエスケープ文字として扱われないように、\\とエスケープする必要があります。
const regexp = new RegExp('\\d+', 'gim');
PerlのquotemetaやRubyのRegExp.quoteのように、()や[]など正規表現のメタ文字と解釈される可能性のある文字をエスケープして返す関数は、Stringオブジェクトのreplaceメソッドを使用して簡単に作成することができます。
const quote = str => str.replace(/\W/g,  $0 => `\\${$0}`);
alert( quote('()') ); // 「\(\)」と表示
/prototype|prototype]]
RegExpオブジェクトのプロトタイプです。
]]