javascript - 分割字符串但保留分割数组中的分隔符

标签 javascript string split

在 JavaScript 中给定一个如下所示的字符串

var a = 'hello world\n\nbye world\n\nfoo\nbar\n\nfoo\nbaz\n\n';

我想把它分成这样的数组

['hello world', '\n\n', 'bye world', '\n\n', 'foo\nbar', '\n\n', 'foo\nbaz', '\n\n'].

如果输入为 var a = 'hello world\n\nbye world',则结果应为 ['hello world', '\n\n', 'bye world ']

换句话说,我想将 '\n\n' 周围的字符串拆分为一个数组,以便该数组也包含 '\n\n'。在 JavaScript 中有什么巧妙的方法可以做到这一点吗?

最佳答案

这是一行:

str.match(/\n\n|(?:[^\n]|\n(?!\n))+/g)

它的工作原理如下:

  • \n\n 匹配两个连续的换行符
  • (?:[^\n]|\n(?!\n))+ 匹配任意一个或多个字符的序列
    • [^\n] 不是换行符,或者
    • \n(?!\n) 换行符,但前提是后面没有另一个换行符

此递归模式可以应用于任何长度:

// useful function to quote strings for literal match in regular expressions
RegExp.quote = RegExp.quote || function(str) {
    return (str+"").replace(/(?=[.?*+^$[\]\\(){}|-])/g, "\\");
};
// helper function to build the above pattern recursively
function buildRecursivePattern(chars, i) {
    var c = RegExp.quote(chars[i]);
    if (i < chars.length-1) return "(?:[^" + c + "]|" + c + buildRecursivePattern(chars, i+1) + ")";
    else return "(?!" + c + ")";
}
function buildPattern(str) {
    return RegExp(RegExp.quote(delimiter) + "|" + buildRecursivePattern(delimiter.match(/[^]/g), 0) + "+", "g");
}

var str = 'hello world\n\nbye world\n\nfoo\nbar\n\nfoo\nbaz\n\n',
    delimiter = "\n\n",
    parts;
parts = str.match(buildPattern(delimiter))

更新    以下是对 String.prototype.split 的修改,它还应添加包含匹配分隔符的功能:

if ("a".split(/(a)/).length !== 3) {
    (function() {
        var _f = String.prototype.split;
        String.prototype.split = function(separator, limit) {
            if (separator instanceof RegExp) {
                var re = new RegExp(re.source, "g"+(re.ignoreCase?"i":"")+(re.multiline?"m":"")),
                    match, result = [], counter = 0, lastIndex = 0;
                while ((match = re.exec(this)) !== null) {
                    result.push(this.substr(lastIndex, match.index-lastIndex));
                    if (match.length > 1) result.push(match[1]);
                    lastIndex = match.index + match[0].length;
                    if (++counter === limit) break;
                }
                result.push(this.substr(lastIndex));
                return result;
            } else {
                return _f.apply(arguments);
            }
        }
    })();
}

关于javascript - 分割字符串但保留分割数组中的分隔符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9854736/

相关文章:

javascript - 如何使用 jQuery 使某个 Div ID 显示在不同的 Div ID 上或之后

javascript - 是否可以将 dijit.layout.TabContainer 选项卡向右对齐?

python - 将字符串转换为 int 或 inverse 更有效?

r - 将不均匀出现的以逗号分隔的字符串拆分为列并填充缺失值

javascript - 如何使导航栏在滚动时改变颜色,但仅当屏幕宽度大于 600px 时?

javascript - 用空值替换选项

java - StringIndexOutOfBoundsException

string - 不区分大小写的 NSString 比较

r - 将串联列拆分到相应的列位置

java - 如何在Java中将句子分成单词,然后将其分为两组?