前後を指定して間の文字列を出力


前と後ろの文字列を指定して、その間にある文字列を抜き出したいです。  
例

[code]

    const str = "あいうえおかきくけこさしすせそ";
    const before = "あいうえお";
    const after = "さしすせそ";
    //出力: "かきくけこ"
    
[/code]

正規表現などを使えばいいのかなと思いつつも書き方が分からないので教えていただきたいです。（正規表現使わない方法でも全然いいです）

ご回答の程、よろしくお願いします。




`before`と`after`の内容は常に決まっているのでしょうか。その場合は、以下のように正規表現を用いれば抜き出すことができます。

[code]

    const result = str.match(/あいうえお(.*)さしすせそ/);
    if (result != null) {
        console.log(result[1]); // かきくけこ
    }
    
[/code]

`before`と`after`が変数の場合は上と同様の正規表現オブジェクトを動的に作る必要がありますが、その場合は`before`や`after`の中に正規表現用の特殊文字が含まれていたら困るのでそれをエスケープする必要があります。これを行う標準的な方法は用意されていませんが、以下のようなコードで行うことができます（[MDNより引用](https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Regular_Expressions)）：

[code]

    function escapeRegExp(string) {
      return string.replace(/[.*+?^=!:${}()|[\]\/\\]/g, '\\$&'); // $&はマッチした部分文字列全体を意味します
    }
    
[/code]

この関数と`RegExp`コンストラクタを用いて以下のように正規表現オブジェクトを作って利用できます。

[code]

    const re = new RegExp(`${escapeRegExp(before)}(.*)${escapeRegExp(after)}`);
    
    const result = str.match(re);
    if (result != null) {
        console.log(result[1]); // "かきくけこ"
    }
    
[/code]

* * *

正規表現を使わない方法としては、文字列の前後から`before`と`after`を検索して真ん中を取り出す方法があります。

[code]

    // strの中のbeforeを前から検索
    const beforeIdx = str.indexOf(before);
    // strの中のafterを後ろから検索
    const afterIdx = str.lastIndexOf(after);
    
    if (beforeIdx >= 0 && afterIdx >= 0) {
        // 両方とも見つかったら中身を取り出す
        const result = str.substring(beforeIdx + before.length, afterIdx);
        console.log(result); // "かきくけこ"
    }  
    
[/code]




`before`と`after`の内容は常に決まっているのでしょうか。その場合は、以下のように正規表現を用いれば抜き出すことができます。

[code]

    const result = str.match(/あいうえお(.*)さしすせそ/);
    if (result != null) {
        console.log(result[1]); // かきくけこ
    }
    
[/code]

`before`と`after`が変数の場合は上と同様の正規表現オブジェクトを動的に作る必要がありますが、その場合は`before`や`after`の中に正規表現用の特殊文字が含まれていたら困るのでそれをエスケープする必要があります。これを行う標準的な方法は用意されていませんが、以下のようなコードで行うことができます（[MDNより引用](https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Regular_Expressions)）：

[code]

    function escapeRegExp(string) {
      return string.replace(/[.*+?^=!:${}()|[\]\/\\]/g, '\\$&'); // $&はマッチした部分文字列全体を意味します
    }
    
[/code]

この関数と`RegExp`コンストラクタを用いて以下のように正規表現オブジェクトを作って利用できます。

[code]

    const re = new RegExp(`${escapeRegExp(before)}(.*)${escapeRegExp(after)}`);
    
    const result = str.match(re);
    if (result != null) {
        console.log(result[1]); // "かきくけこ"
    }
    
[/code]

* * *

正規表現を使わない方法としては、文字列の前後から`before`と`after`を検索して真ん中を取り出す方法があります。

[code]

    // strの中のbeforeを前から検索
    const beforeIdx = str.indexOf(before);
    // strの中のafterを後ろから検索
    const afterIdx = str.lastIndexOf(after);
    
    if (beforeIdx >= 0 && afterIdx >= 0) {
        // 両方とも見つかったら中身を取り出す
        const result = str.substring(beforeIdx + before.length, afterIdx);
        console.log(result); // "かきくけこ"
    }  
    
[/code]

