2014-04-04 129 views
1

我需要split一个字符串,但只有最后一次出现separator(可能会出现很多次),我可以做(见下文),但我想创建的动态(从说,用户输入),而不是有它在硬编码正则表达式创建

例如:

var separator= /abc/; 
var stringToSplit = 'ONEabc123TWO45THREEabc67FOUR'; 
var result = stringToSplit.split(/(\abc)(?!.*\abc)/); 
/*['ONEabc123TWO45THREE', 'abc', '67FOUR']*/ 

相反,我愿做这样的:

function make(sep){ 
    ...magic happens here... 
    return superSeparator; 
} 
var separator = make(/abc/); 
var stringToSplit = 'ONEabc123TWO45THREEabc67FOUR'; 
var result = stringToSplit.split(separator); 
/*['ONEabc123TWO45THREE', 'abc', '67FOUR']*/ 

JSfiddle

这是可能的没有沿所有分隔符拆分它,只是粘在一起,除了最后一起join()

+0

你为什么要逃离'了'? – Toto

回答

2

您使用RegExp构造此

var re = new RegExp(pattern, flags); 

因此,例如,

function makeMySeparator(pattern) { 
    if (pattern instanceof RegExp) // if input is a RegExp already 
     pattern = pattern.source; // get the string of it's pattern 
    return new RegExp('(' + pattern + ')(?!.*' + pattern + ')'); 
} 

makeMySeparator('\\abc'); // /(\abc)(?!.*\abc)/ 

记住,你需要逃避反斜杠如果你正在写字符串文字,否则当它被解释时它们将消失。

+0

谢谢!虽然,可以使用'/ abc /'作为参数而不是''abc'吗?我可以解决它,但前者会使我的代码更加一致。 – Kvothe

+0

@Kvothe你可以做,但你仍然必须创建一个新的_RegExp_实例,所以它并不能真正为你节省很多。你可以通过访问're.source'来获得_RegExp_的底层模式作为字符串。我会在 –

0

我认为你可以做到这一点与原生JS:

function splitOnLastSeparator(separatorToSplit, separator) { 
    var length = separatorToSplit.length, 
    index = separatorToSplit.lastIndexOf(separator); 
    var arr = []; 
    arr.push(separatorToSplit.substr(0, index)); 
    arr.push(separator); 
    arr.push(separatorToSplit.substr(index + separator.length, length)); 
    return arr; 
} 
console.log(splitOnLastSeparator('ONEabc123TWO45THREEabc67FOUR', 'abc')); 
+0

'19'编辑它应该是'index'?但我宁愿坚持正则表达式,谢谢。 – Kvothe

+0

是的,一个错字。谢谢 –