2013-10-04 3 views
0

Почему это регулярное выражение помещает пустые строки в начало и конец массива совпадений?Почему использование + по-прежнему соответствует пустой строке

var s = "1111abcd2222"; 

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

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

Я думал + оператор должен избежать пустой строки соответствует becuase это требует как минимум одного символа.

+1

Поскольку вы использовали 'split' вместо' match'? – falsetru

ответ

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", "" ] 
+1

'/^(\ d +) ([a-z] *?) (\ D +) $ /' все равно дает мне пустые строки в конце, если сопоставить строку в моем вопросе. – 1252748

+0

Вы используете 'split', это полное совпадение, так что остальные части пустые. Подобно '' aaa ".split (" a ")' дает вам 4 пустые строки. – Halcyon

0

Вы должны использовать String#match вместо String#split здесь.

Однако, если вы хотите использовать раскол, то следующее регулярное выражение отрицательного на основе опережения позволит избежать пустых результатов:

re = /(?!^)(\d+)([a-z]*?)(\d+)(?!$)/g; 
//=> ["1", "111", "abcd", "222", "2"] 
Смежные вопросы