この正規表現が空の文字列をマッチ配列の最初と最後に入れるのはなぜですか?
var s = "1111abcd2222";
var re = /(\d+)([a-z]*?)(\d+)/g;
console.log(s.split(re)); //=>"", "1", "abcd", "2222", ""]
+
最低でも 1 文字が必要なため、オペレーターは空の文字列の一致を避けると考えました。
この正規表現が空の文字列をマッチ配列の最初と最後に入れるのはなぜですか?
var s = "1111abcd2222";
var re = /(\d+)([a-z]*?)(\d+)/g;
console.log(s.split(re)); //=>"", "1", "abcd", "2222", ""]
+
最低でも 1 文字が必要なため、オペレーターは空の文字列の一致を避けると考えました。
開始と終了のインジケーターがありません:
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", "" ]
String#match
ここの代わりに使用する必要がありString#split
ます。
ただし、分割を使用したい場合は、否定的な先読みベースの正規表現に従うと、空の結果が回避されます。
re = /(?!^)(\d+)([a-z]*?)(\d+)(?!$)/g;
//=> ["1", "111", "abcd", "222", "2"]