0

2 つ以上の新しいセリフに直面した場合を除いて、すべてをキャプチャする最良の方法は何ですか?

元:

name1
address1
zipcode

name2
address2
zipcode

name3
address3
zipcode

私が検討した 1 つの正規表現は/[^\n\n]*\s*/g. しかし、これは単一の\nキャラクターに直面すると停止します。

私が考えた別の方法は/((?:.*(?=\n\n)))\s*/g. しかし、これは前の行を無視して最後の行のみをキャプチャするようです。

同様の状況を処理する最良の方法は何ですか?

4

3 に答える 3

1

((.+)\n?)*(おそらく、グループを非キャプチャーにしたいでしょう。読みやすくするためにそのままにしておきます)

内側の部分(.+)\n?は「空でない行」を意味します (少なくとも 1 つの非改行文字 . は、適切なフラグが設定され、その後にオプションの改行が続く場合を除き、改行と一致しません)

次に、それが任意の回数繰り返されます (非空白行のブロック全体に一致します)。

ただし、何をしているかによっては、正規表現はおそらく探している答えではありません。文字列を分割するだけで\n\nは、あなたが望むことはできませんか?

于 2013-01-01T06:27:39.060 に答える
1

正規表現を使用する必要がありますか? 解決策はそれがなくても簡単です。

var data = 'name1...';

var matches = data.split('\n\n');

個々のサブセクションにアクセスするには、再度分割し\nます。

//the first section's name
var name = matches[0].split('\n')[0];
于 2013-01-01T06:29:40.800 に答える
1

アップデート

可変長セパレーターを、処理されたテキストに表示されない既知の固定長文字列に置き換えてから分割することを検討できます。例えば:

> var s = "Hi\n\n\nBye\nCiao";
> var x = s.replace(/\n{2,}/, "#");
> x.split("#");
["Hi", "Bye
Ciao"]

エレガントなソリューションだと思います。次のやや不自然な正規表現を使用することもできます

> s.match(/((?!\n{2,})[\s\S])+/g);
["Hi", "
Bye
Ciao"]

次に、配列内のすべての文字列の先頭/末尾にあるものtrim()を取り除くために、文字列メソッドをそのメンバーに適用して、結果の配列を処理します。\n

于 2013-01-01T09:56:14.693 に答える