如何在不丢失分隔符且没有正则表达式的情况下拆分字符串?

时间:2017-01-31 06:32:17

标签: javascript

我有一个类似于"<p></p>"的字符串。现在,我想拆分这个字符串,所以我有2个标签。如果我做

var arr = "<p></p>".split("><"),我得到一个看起来像

的数组

["<p", "/p>"]

是否有一种简单的方法可以将分隔符保留在此拆分中?不是我想要的REGEX(不是骗局):

["<p>","</p>"]

2 个答案:

答案 0 :(得分:1)

由于javascript正则表达式不支持断言,因此使用String#split方法是不可能的。使用String#match方法获取完整的字符串。

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

console.log(arr)

如果没有正则表达式并使用拆分,您可以执行类似的操作。

var arr = "<p></p>".split('><').map(function(v, i, arr1) {
  if (i != 0)
    v = '<' + v;
  if (i < arr1.length - 1)
    v += '>';
  return v;
})

// using ternary 
var arr1 = "<p></p>".split('><').map(function(v, i, arr1) {
  return (i != 0 ? '<' : '') + v + (i < arr1.length - 1 ? '>' : '');
})

console.log(arr);
console.log(arr1);

答案 1 :(得分:0)

要在没有正则表达式的情况下执行此操作,您需要某种解析器。检查每个角色,构建块并将它们存储在一个数组中。然后,您可能希望处理这些位,寻找令牌或进行其他处理。 E.g。

&#13;
&#13;
/* Break string into chunks of <...>, </...> and anything in between.
** @param {string} s - string to parse
** @returns {Array} chunks of string
*/
function getChunks(s) {
    var parsed = [];
    var limit = s.length - 1;

    s.split('').reduce(function(buffer, char, i) {
      var startTag = char == '<';
      var endTag   = char == '/';
      var closeTag = char == '>';

      if (startTag) {
        if (buffer.length) {
          parsed.push(buffer);
        }
        buffer = char;

      } else if (endTag) {
        buffer += char;

      } else if (closeTag) {
        parsed.push(buffer + char)
        buffer = '';

      } else {
        buffer += char;
      }

      if (i == limit && buffer.length) {
        parsed.push(buffer);
      }

      return buffer;
    }, '');
    return parsed;
}


['<p></p>',
 '<div>More complex</div>',
 '<span>broken tag</sp'
].forEach(function(s){
  console.log(s + ' => [' + getChunks(s) + ']')
});
&#13;
&#13;
&#13;

请注意,这非常简单,只需查找<...></...>,其中...可以是任何内容。