Javascript:在字符串中拆分未关闭的标签?

时间:2018-02-01 20:48:03

标签: javascript regex parsing

我有一个简单的标记语言,支持如下语句:

<pause> <state:OK> <fast> Oh <pause> sure, yep! <pause> Yep I certainly do

我想将这些语句拆分为像

这样的数组
 ["<pause> ", "<state:OK> ", "<fast>", "Oh ", "<pause>",  "sure, yep! ", "<pause>", " Yep I certainly do!"]

我试图使用像

这样的正则表达式
line.split(/(?=<.+>)/)

但我得到的数组是

["<pause> ", "<state:OK> ", "<fast> Oh ", "<pause> sure, yep! ", "<pause> Yep I certainly do!"]

我应该在第一个字符串上使用什么正则表达式来获得我想要的结果?

请注意,我没有解析HTML。

4 个答案:

答案 0 :(得分:2)

我建议使用match代替split

var line = "<pause> <state:OK> <fast> Oh <pause> sure, yep! <pause> Yep I certainly do";

var arr = line.match(/<.+?>|\S[^<]*?(?=\s*(<|$))/g)

console.log(arr);

答案 1 :(得分:0)

我们可以通过标签(标记)将其拆分,然后修剪生成的字符串以删除任何空格。过滤器删除虚假值,包括空字符串。

str.split(/(<.+?>)/).filter(_ => (_.trim()));

console.log(
"<pause> <state:OK> <fast> Oh <pause> sure, yep! <pause> Yep I certainly do".split(/(<.+?>)/).filter(_ => (_.trim())) 
);

答案 2 :(得分:0)

正则表达的乐趣:有一千种皮肤猫的方法。

const str = '<pause> <state:OK> <fast> Oh <pause> sure, yep! <pause> Yep I certainly do';

const regex = /((?:<[^>]+>\s|\b[^<>]+))/g;

const matches = str.match(regex);

console.log({matches});

答案 3 :(得分:-1)

当然,真正的问题是你为什么要处理这些荒谬的数据。事实上,你可能想尝试这个:

&#13;
&#13;
var testStr = '<pause> <state:OK> <fast> Oh <pause> sure, yep! <pause> Yep I certainly do';
function weirdSplit(str){
  return str.match(/<[^>]+>|[^ ]+[^<>]+(?=\s|$)/g);
}
console.log(weirdSplit(testStr));
&#13;
&#13;
&#13;