Javascript 和正则表达式:拆分字符串并保留分隔符

IT技术 javascript regex
2021-01-18 22:07:15

我有一个字符串:

var string = "aaaaaa<br />&dagger; bbbb<br />&Dagger; cccc"

我想用分隔符<br />后跟一个特殊字符来分割这个字符串

为此,我正在使用它:

string.split(/<br \/>&#?[a-zA-Z0-9]+;/g);

我得到了我需要的东西,除了我丢失了分隔符。这是示例:http : //jsfiddle.net/JwrZ6/1/

我怎样才能保留分隔符?

6个回答

我遇到了类似但略有不同的问题。无论如何,这里是三个不同场景的示例,用于保留分隔符的位置。

"1、2、3".split("、") == ["1", "2", "3"]
"1、2、3".split(/(、)/g) == ["1", "、", "2", "、", "3"]
"1、2、3".split(/(?=、)/g) == ["1", "、2", "、3"]
"1、2、3".split(/(?!、)/g) == ["1、", "2、", "3"]
"1、2、3".split(/(.*?、)/g) == ["", "1、", "", "2、", "3"]

警告:第四个仅适用于拆分单个字符。ConnorsFan提出了一个替代方案

// Split a path, but keep the slashes that follow directories
var str = 'Animation/rawr/javascript.js';
var tokens = str.match(/[^\/]+\/?|\//g);
.match这些示例非贪婪解决方案的翻译"11、22、33".match(/.*?、|.+$/g)-> ["11、", "22、", "33"]注意/g修饰符对于匹配至关重要。
2021-03-15 22:07:15
我不明白为什么每个人都在使用 /g
2021-03-24 22:07:15
如何使用这个正则表达式 "1、2、3".split(/(?!、)/g) == ["1、", "2、", "3"] 来表示完整的单词?例如“foo1, foo2, foo3,”
2021-03-27 22:07:15
你是个天才!. 在哪里可以找到解释其工作方式的文档?你不需要g结尾
2021-04-02 22:07:15
我正在寻找类似于第三个示例的内容,但这仅在元素只有一个字符时才有效 - 否则它将拆分为单个字符。最后我不得不走乏味的RegExp.exec路线。
2021-04-04 22:07:15

使用(正)前瞻,以便正则表达式断言特殊字符存在,但实际上并不匹配它:

string.split(/<br \/>(?=&#?[a-zA-Z0-9]+;)/g);

看看它在行动:

var string = "aaaaaa<br />&dagger; bbbb<br />&Dagger; cccc";
console.log(string.split(/<br \/>(?=&#?[a-zA-Z0-9]+;)/g));

在您提供的链接中,我找不到任何关于正向前瞻的信息。
2021-03-18 22:07:15
@PaulJones 内容在中间时间被移动。谢谢你让我知道,我修复了链接。
2021-03-24 22:07:15
Torsten Walter 的回答更好一些,因为分隔符被放入它们自己的数组项中。更容易操作。
2021-03-29 22:07:15
当我回到这一点时对自己发表评论:“积极”前瞻是 (?=)
2021-04-03 22:07:15
当我使用此代码时,它会0在每个字符串的末尾添加一个
2021-04-06 22:07:15

如果将分隔符包装在括号中,它将成为返回数组的一部分。

string.split(/(<br \/>&#?[a-zA-Z0-9]+);/g);
// returns ["aaaaaa", "<br />&dagger;", "bbbb", "<br />&Dagger;", "cccc"]

根据您要保留的部分更改您匹配的子组

string.split(/(<br \/>)&#?[a-zA-Z0-9]+;/g);
// returns ["aaaaaa", "<br />", "bbbb", "<br />", "cccc"]

您可以通过忽略字母的大小写来改进表达式 string.split(/()&#?[a-z0-9]+;/gi);

您可以像这样匹配预定义的组:\dequals[0-9]\wequals [a-zA-Z0-9_]这意味着您的表情可能如下所示。

string.split(/<br \/>(&#?[a-z\d]+;)/gi);

JavaScriptKit 上有一个很好的正则表达式参考

为什么这么低..它完美而灵活
2021-03-15 22:07:15
更好的是,我不知道我们只能保留分隔符的一部分。事实上,我只需要保留特殊字符,我可以这样做: string.split(/<br \/>(&#?[a-zA-Z0-9]+;)/g);
2021-03-16 22:07:15
这当然是最简单的方法,也是最易读的语法。
2021-03-28 22:07:15
您可以通过忽略单词的大小写来优化您的表达方式。或者匹配预定义的字符类。我会更新我的答案。
2021-03-29 22:07:15

在这里也回答了 JavaScript 拆分正则表达式保留分隔符

在正则表达式示例中使用 (?=pattern) 前瞻模式

var string = '500x500-11*90~1+1';
string = string.replace(/(?=[$-/:-?{-~!"^_`\[\]])/gi, ",");
string = string.split(",");

这将为您提供以下结果。

[ '500x500', '-11', '*90', '~1', '+1' ]

也可以直接拆分

string = string.split(/(?=[$-/:-?{-~!"^_`\[\]])/gi);

给出相同的结果

[ '500x500', '-11', '*90', '~1', '+1' ]
为什么不像乔恩接受的答案那样立即分裂?
2021-03-30 22:07:15
@Gordon... :) 我可以这样做...更新代码...干杯
2021-04-08 22:07:15

我对jichi的回答做了修改,放到了一个也支持多字母的函数中。

String.prototype.splitAndKeep = function(separator, method='seperate'){
    var str = this;
    if(method == 'seperate'){
        str = str.split(new RegExp(`(${separator})`, 'g'));
    }else if(method == 'infront'){
        str = str.split(new RegExp(`(?=${separator})`, 'g'));
    }else if(method == 'behind'){
        str = str.split(new RegExp(`(.*?${separator})`, 'g'));
        str = str.filter(function(el){return el !== "";});
    }
    return str;
};

jichi 的答案第 3 种方法在此函数中不起作用,因此我采用了第 4 种方法,并删除了空格以获得相同的结果。

编辑:除数组之外的第二种方法来拆分 char1 或 char2

String.prototype.splitAndKeep = function(separator, method='seperate'){
    var str = this;
    function splitAndKeep(str, separator, method='seperate'){
        if(method == 'seperate'){
            str = str.split(new RegExp(`(${separator})`, 'g'));
        }else if(method == 'infront'){
            str = str.split(new RegExp(`(?=${separator})`, 'g'));
        }else if(method == 'behind'){
            str = str.split(new RegExp(`(.*?${separator})`, 'g'));
            str = str.filter(function(el){return el !== "";});
        }
        return str;
    }
    if(Array.isArray(separator)){
        var parts = splitAndKeep(str, separator[0], method);
        for(var i = 1; i < separator.length; i++){
            var partsTemp = parts;
            parts = [];
            for(var p = 0; p < partsTemp.length; p++){
                parts = parts.concat(splitAndKeep(partsTemp[p], separator[i], method));
            }
        }
        return parts;
    }else{
        return splitAndKeep(str, separator, method);
    }
};

用法:

str = "first1-second2-third3-last";

str.splitAndKeep(["1", "2", "3"]) == ["first", "1", "-second", "2", "-third", "3", "-last"];

str.splitAndKeep("-") == ["first1", "-", "second2", "-", "third3", "-", "last"];
很有用!谢谢!仅供路过的人使用...这将拆分为单独的元素换行符。如果您不想要这种行为,请使用 'gs' 而不是 'g'
2021-03-29 22:07:15