我该如何轻松地分割这个字符串?

3

I have the following string:

"<--something--><++something++><**something**>"

该字符串可以有任意数量的“某些内容”,甚至只出现一次。

我需要这样拆分:

["<--something-->", "<++something++>", ...]

但我不知道最好的操作方法。

我会做类似于string.split("><")这样的操作,但是这样我会得到:

["<--something--", "++something++", ...]

使用string.split(/(><)/),我将得到:

["<--something--", "><", "++something++", "><", ...]

我可以想到一些不太理想的解决方案,但我希望有一个真正优雅的解决方案。

@Jack 噢,那听起来像是一个不错的建议。 - MarioDS
如果您想获取内部内容(< >中的内容),请访问http://jsfiddle.net/5qwNV/。 - Ian
@Ian 我需要全部,但还是谢谢 :) - MarioDS
请告诉我这不是HTML。如果不是,请告诉我它是什么 :) - Ja͢ck
@Jack,这不是HTML,而是一种内部模板语言的一部分,具有非常特定的目的,所以我可以告诉你,但这并不重要 :) - MarioDS
4个回答

4
你不是在分割字符串,而是在匹配它。
试试这个:
string.match(/<(.)\1[^>]+?\1\1>/g)

这将匹配 <,两个相同的字符,然后找到同样的两个相同字符,并以 > 结尾。


3
var s = '<--something--><++something++><**something**>',
    p = s.match(/(<[^>]+>)/g);
console.log(p); // ["<--something-->", "<++something++>", "<**something**>"]

这仅是假设每个“token”内部不会包含>。因此,以下情况会导致其失败:

<--some>thing--><++something++><**something**>
       ^ problematic

我想强调的是,如果你正在使用它来解析HTML,请停止操作。如果你想从HTML中获取特定元素,正则表达式不是正确的解决方案。相反,将内容放在一个隐藏的<div>(或其他元素)中,并使用本机DOM访问器。


2
这个表达式应该可以解决这个问题:
"<--something--><++something++><**something**>".match(/<([+*-])\1.*?\1\1>/g)

它匹配一个左尖括号,接着是两个相同的字符(来自于+-*集合中的字符,但你也可以使用.来匹配任何字符);它以相同的两个字符和一个右尖括号结束。


-1

解决方案:

var a = "<--something--><++something++><**something**>";
a.match(/\<(\-|\+|\*)+something(\-|\+|\*)+\>/g);

结果:

["<--something-->", "<++something++>", "<**something**>"]

不,你正在创建匹配组。这不是我想要的。而且,我并不是指 something 是字面意思。 - MarioDS
你没有说你不需要匹配组,而且你可以用([\w])+替换某些内容。 - Avihay Menahem

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接