

javascriptで、下記のようなテキストから [ と ] に囲まれていない部分の"。"で終わる文を正規表現で取得したいと考えています。

[code]

    あいうえお
    [
    あいうえお。
    かきくけこ。
    ]
    こんにちは。
    さようなら。
    hello
    
[/code]

試した方法は、[]内にマッチする正規表現パターンを否定先読みで除外するという方法で、以下のように書きましたが、結果は[]内の  
あいうえお。かきくけこ。  
にもマッチしてしまいました。

[code]

    /^(?!\[[\s\S]*?\]).*?。$/gm
    
[/code]

目的を満たすにはどのように書けばよいのでしょうか？


CC BY-SA 4.0
2019-09-02T12:53:36.417
57773
2019-12-25T12:43:16.127
2019-12-25T12:43:16.127
32986
35677
question
javascript 正規表現
正規表現で複数行にまたがる角括弧に囲まれた部分を除外して、マッチさせたい


フラグに`m`を指定しているため、`^$`が行頭と行末に一致します。  
なのでご質問の`/^(?!\[[\s\S]*?\]).*?。$/gm`は否定先読みとは関係なく、行末に`。`のない全ての行にヒットしています。  
例えば`]`を`]。`に書き換えることで、その行もヒットしてしまいます。

複数行の`[]`を除外しながら各行末の`。`を判定するのは厳しいです。  
@cubick
さんのコメントのようにまずは`m`フラグを使わずに括弧を除外してから、改めて`m`フラグで各行のマッチを取得する方法が、目的を満たすには相応しい書き方だと思います。

[code]

    var s = "あいうえお\r\n" +
    "[\r\n" +
    "あいうえお。\r\n" +
    "かきくけこ。\r\n" +
    "]\r\n" +
    "こんにちは。\r\n" +
    "さようなら。\r\n" +
    "hello";
    r = s.replace(/^([\s\S]*)\[[\s\S]*\]([\s\S]*)$/, "$1$2");
    m = r.match(/^.+。$/gm);
    console.log(m);
[/code]


CC BY-SA 4.0
2019-09-02T15:14:06.703
57777
2019-09-02T15:14:06.703
9820
57773
answer


こんな感じでしょうか。

[code]

    var s = 
    "はじめまして。\n" +
    "あいうえお\n" +
    "[\n" +
    "あいうえお。\n" +
    "かきくけこ。\n" +
    "]\n" +
    "こんにちは。\n" +
    "[\n" +
    "たちつてと。\n" +
    "]\n" +
    "さようなら。\n" +
    "hello";
    var regex = /(?<!\[[^\]]*)^[^\[\]]*。$/gm;
    var match = s.match(regex);
    console.log(match);
[/code]

「`[`の後、`]`が現れないままだとダメ」と言うのを否定先読みで表現しています。

単純な例では動いている(Safariでは否定先読みは動きませんでしたが…)と思うんですが、「`[` と `]`
の間に挟まれた部分を削除」と言う方がわかりやすくて良さそうに思います。


CC BY-SA 4.0
2019-09-02T20:49:35.993
57779
2019-09-02T20:49:35.993
13972
57773
answer