0

この正規表現が空の文字列をマッチ配列の最初と最後に入れるのはなぜですか?

var s = "1111abcd2222";

var re = /(\d+)([a-z]*?)(\d+)/g;

console.log(s.split(re)); //=>"", "1", "abcd", "2222", ""] 

+最低でも 1 文字が必要なため、オペレーターは空の文字列の一致を避けると考えました。

4

2 に答える 2

2

開始と終了のインジケーターがありません:

var re = /^(\d+)([a-z]*?)(\d+)$/g;
//        ^- start            ^ -end

文字列は、貪欲である必要がないという理由だけでaa1bb一致する可能性があります。を使用する場合は、最初から一致を開始し、最後で停止する必要があることを示します。/([a-z]+)\d([a-z]+)/a1b/^([a-z]+)\d([a-z]+)$/aa1bb[ "aa1bb", "aa", "bb" ]

を使用しているため、最初と最後に空の文字列が表示されますsplit

"aaa".split(/a/); // [ "", "", "", "" ]
"abab".split(/(ab)/); // [ "", "ab", "", "ab", "" ]
于 2013-10-04T16:01:06.920 に答える
0

String#matchここの代わりに使用する必要がありString#splitます。

ただし、分割を使用したい場合は、否定的な先読みベースの正規表現に従うと、空の結果が回避されます。

re = /(?!^)(\d+)([a-z]*?)(\d+)(?!$)/g;
//=> ["1", "111", "abcd", "222", "2"]
于 2013-10-04T16:06:55.487 に答える