48613


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

[code]

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

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

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


CC BY-SA 4.0
2018-09-21T05:27:04.307
48611
2018-09-21T05:39:14.347
30065
question
javascript jquery
前後を指定して間の文字列を出力


## 単純に正規表現を使う例

[code]

    const str = "あいうえおかきくけこさしすせそ";
    const before = "あいうえお";
    const after = "さしすせそ";
    let re = new RegExp(before+'(.*?)'+after); // 間の部分を最小マッチ
    str.replace(re, '$1'); // マッチした部分だけ残すように置換
    // => 'かきくけこ'
    
[/code]

## 正規表現を使わず、前後の文字列を順番に除去する例

[code]

    const str = "あいうえおかきくけこさしすせそ";
    const before = "あいうえお";
    const after = "さしすせそ";
    str.replace(before, '').replace(after, '')
    // => 'かきくけこ'
    
[/code]


CC BY-SA 4.0
2018-09-21T05:33:12.167
48612
2018-09-21T05:33:12.167
29826
48611
answer


`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]


CC BY-SA 4.0
2018-09-21T05:39:14.347
48613
2018-09-21T05:39:14.347
30079
48611
answer