2016-09-18 3 views
0

Я пытаюсь создать массив, содержащий подстроки строки, которая передает мое регулярное выражение и подстроки. Например:Сочетание результатов .split() и .match()

['stringpart1', 'match1', 'stringpart2', 'match2', 'stringpart3']

Это мое регулярное выражение: new RegExp("<(\/)?" + tag + ".*?>", "g");

Я использую исходный код страницы строки что-то вдоль линий:

"<html>\n 
    <meta class='a'/>\n 
    <meta class='b'/>\n 
    <div>\n 
     <p>test</p>\n 
    </div>\n 
</html>" 

Если я использую мою страницу источник с .split(re) , Я получаю значение

['<html>\n', undefined, '\n', undefined, '\n', '<div>\n<p>test</p>\n</div>\n</html>]

Если значения, соответствующие строке, равны undefined.

Когда я использую .match(re), все совпавшие значения возвращаются, как и ожидалось:

['<meta class='a'/>', '<meta class='b'/>']

Есть ли Javascript функция, которая может генерировать результат ниже?

['<html>\n', "<meta class='a'/>", '\n', "<meta class='b'/>", '\n', '<div>\n<p>test</p>\n</div>\n</html>] 
+0

Может быть, посмотреть на regex.exec здесь: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/exec – klikas

+0

Что 'RegExp 'ожидается, чтобы соответствовать? – guest271314

+0

Зачем вы это делаете? Что вы планируете делать с результатами? Кроме того, где в вашем HTML строки 'stringpart1' и' match1' и т. Д. Вы утверждаете, что возвращаетесь? –

ответ

3

Edit - мое решение было основано на оригинальный вопрос до редактирования. Я бы пересмотрел, но я на самом деле думаю, что после редактирования вопроса, ответ Джеймса Эманона находится на месте, и все, что я придумал, было бы просто перефразированием того, что у него есть.

Основываясь на регулярном выражении, которое у вас было, кажется, что вы хотите, чтобы сделать это, выбрать конкретный тег html и выполнить поиск содержимого для всех вхождений этого тега, а затем выводить как начальный, так и конечный теги плюс содержимое в выходной массив.

Вот один из способов достижения этой цели: решение repl.it link

const text = "<html><div>content</div>><div>content</div></html>"; 
const tag = "div"; 
const re = new RegExp("(<"+tag+">)(.*?)(<\/"+tag+">)", "g"); 
let final = []; 

let matches = text.match(re).map((m) => m.replace(/>(.)/, ">@@@$1") 
             .replace(/\<(?=[^\<]*$)/, "@@@<") 
             .split("@@@")); 

for (let i=0; i<matches.length; i++) { 
    for (let j=0; j<matches[i].length; j++) { 
     final.push(matches[i][j]); 
    } 
} 

console.log(final); 
2

P1xt превыше хорошо. Для более короткой версии, эта «кажется» работает - вот быстрая работа, которую я сделал. Я предполагаю, что undefined соответствует массиву 'matches'.

var text = "<html>\n<meta class='a'/>\n<meta class='b'/>\n<div>\n<p>test</p>\n</div>\n</html>" 
var tag = "meta"; 
var re = new RegExp("<(\/)?" + tag + ".*?>", "gm") 
var matches = text.match(re) 

text.split(re).reduce((p,c) => { 
    (!c) ? p.push(matches.shift()) : p.push(c); 
    return p; 
}, []) 
Смежные вопросы