2015-10-28 3 views
1

Это не возвращает то, что я, или regex101 ожидает:Regex: .exec() функция не возвращает ожидаемый результат

var myString = "Accel World|http://www.anime-planet.com/anime/accel-worldAh! My Goddess|http://www.anime-planet.com/anime/ah-my-goddess"; 
var reg = /[^|]*/g; 
var regResponse = reg.exec(myString); 
console.log(regResponse); 

согласно regex101, это должно соответствовать все, кроме '|' и вернуть его, но он соответствует только первой строке, Accel World, в отличие от всего, кроме '|'.

Как исправить это?

+4

То, что вы просили, чтобы оно совпадало, равно нулю или более ** последовательным ** символам, которые не '' '. Почему бы просто не использовать 'myString.split ('|')' для получения массива строк, разделенных '|'? – Phil

+0

Интересно, любой подсказку, почему regex101 возвращает все, а не просто подряд? Это кажется странным, потому что это очень рекомендуется. Возможно, будет .split, спасибо за идею. – ActionON

+0

Возможно, потому, что он не использует 'exec', который ведет себя по-другому, как вы ожидаете. См. Https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/exec#Finding_successive_matches – Phil

ответ

1

Вы должны петли .exec(), чтобы получить все матчи. documentation говорит

Если регулярное выражение использует «г» флаг, вы можете использовать Exec() метод несколько раз, чтобы найти последовательные матчи в одной и той же строке.

var reg = /[^|]+/g; 
while(regResponse = reg.exec(myString)) { 
    console.log(regResponse); 
} 
+0

Хотя' exec' является допустимым способом приблизиться к этому, 'match' является более удобным в этом случае. – nhahtdh

1

Попробуйте "+" вместо "*"

Так,

var reg = /[^|]+/g; 
+0

Не изменяет, что возвращает exec(). – ActionON

+3

@ActionON это, если вы запускаете 'exec' более одного раза – Phil

3

Exec будет возвращать только один результат, в то время (последующие вызовы будут возвращать остальное, но вы также должны использовать + вместо *)

Вы можете использовать myString.match(reg) htough чтобы получить все результаты за один раз.

var myString = "Accel World|http://www.anime-planet.com/anime/accel-worldAh! My Goddess|http://www.anime-planet.com/anime/ah-my-goddess"; 
var reg = /[^|]+/g; 
var regResponse = myString.match(reg); 
console.log(regResponse); 
Смежные вопросы