我有一个字符串:
var string = "aaaaaa<br />† bbbb<br />‡ cccc"
我想用分隔符<br />
后跟一个特殊字符来分割这个字符串。
为此,我正在使用它:
string.split(/<br \/>&#?[a-zA-Z0-9]+;/g);
我得到了我需要的东西,除了我丢失了分隔符。这是示例:http : //jsfiddle.net/JwrZ6/1/
我怎样才能保留分隔符?
我有一个字符串:
var string = "aaaaaa<br />† bbbb<br />‡ cccc"
我想用分隔符<br />
后跟一个特殊字符来分割这个字符串。
为此,我正在使用它:
string.split(/<br \/>&#?[a-zA-Z0-9]+;/g);
我得到了我需要的东西,除了我丢失了分隔符。这是示例:http : //jsfiddle.net/JwrZ6/1/
我怎样才能保留分隔符?
我遇到了类似但略有不同的问题。无论如何,这里是三个不同场景的示例,用于保留分隔符的位置。
"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);
使用(正)前瞻,以便正则表达式断言特殊字符存在,但实际上并不匹配它:
string.split(/<br \/>(?=&#?[a-zA-Z0-9]+;)/g);
看看它在行动:
var string = "aaaaaa<br />† bbbb<br />‡ cccc";
console.log(string.split(/<br \/>(?=&#?[a-zA-Z0-9]+;)/g));
如果将分隔符包装在括号中,它将成为返回数组的一部分。
string.split(/(<br \/>&#?[a-zA-Z0-9]+);/g);
// returns ["aaaaaa", "<br />†", "bbbb", "<br />‡", "cccc"]
根据您要保留的部分更改您匹配的子组
string.split(/(<br \/>)&#?[a-zA-Z0-9]+;/g);
// returns ["aaaaaa", "<br />", "bbbb", "<br />", "cccc"]
您可以通过忽略字母的大小写来改进表达式 string.split(/()&#?[a-z0-9]+;/gi);
您可以像这样匹配预定义的组:\d
equals[0-9]
和\w
equals [a-zA-Z0-9_]
。这意味着您的表情可能如下所示。
string.split(/<br \/>(&#?[a-z\d]+;)/gi);
JavaScriptKit 上有一个很好的正则表达式参考。
在这里也回答了 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' ]
我对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"];