使用jquery或javascript拆分具有不同分隔符的字符串

时间:2012-05-22 00:01:28

标签: javascript jquery split

我们可以使用javascript split方法将字符串拆分为子字符串数组。例如:

var timeformat="HH:MM:SS";
var timeformatarray=timeformat.split(":");

如果分隔符不是常量,是否有一种简单的方法来分割字符串。实际上,我必须将时间格式分成任何格式,例如:

var timeformat="HH hr : MM min : SS sec";
var timeformat="HHhour:MMminute:SSsecond";
var timeformat="HHh MMm SSs";

只有常数是HH,MM和SS。 Timeformat是用户指定他们想要显示的时间格式的选项。 “HH”,“MM”和“SS”是常量文本(非数字),这三个是固定常量,不会改变。只有可以改变的是timeformat字符串中的后缀和分隔符,如上例所示。

我想要一种方法将timeformat字符串拆分成一个数组,以便我可以处理它。我希望结果是:

timeformat[0] = "HH"
timeformat[1] = " hr : " <- with spaces (if any)
timeformat[2] = "MM"
timeformat[3] = " min : "
timeformat[4] = "SS"
timeformat[5] = " sec"

使用此数组,我将格式化时间并添加相应的后缀和分隔符。我尝试了各种方法,使用正则表达式并循环遍历每个字符,但它们并不高效和直接。感谢您的帮助。

解决方案: 我能够通过使用正则表达式,拆分和数组创建一个处理formatstring的方法来解决这个问题。我相信会有更好的解决方案,但我无法得到任何解决问题的方法。我要感谢Stephen C关于正则表达式的方向。

function GetTimeFormatArray(timeformatstring){
        var timesuffixes = timeformatstring.split(/HH|MM|SS/);
        timesuffixes= $.grep(timesuffixes,function(n){
            return(n);
        });

        var pattern = timesuffixes.join('|');
        var timeprefixes = timeformatstring.split(new RegExp(pattern));
        timeprefixes = $.grep(timeprefixes,function(n){
            return(n);
        });

        var timeFormatArray = [];
        for(var i = 0; i < timesuffixes.length; i++){
            timeFormatArray.push(timeprefixes[i]);
            timeFormatArray.push(timesuffixes[i]);
        }
        return timeFormatArray;
    }

3 个答案:

答案 0 :(得分:1)

函数split()可以将正则表达式作为分隔符。 Here's a sample但我不是正则表达式的专家,所以这可能不会被优化。

var test = 'HH hr : MM min : SS sec';

//split by ":" or space with optional leading and trailing space
console.log(test.split(/\s?[\s:]\s?/));​
//["HH", "hr", "MM", "min", "SS", "sec"]

答案 1 :(得分:1)

如果我在Java中这样做,我会从look-aheads and look-behinds编写分隔符正则表达式。不幸的是,Javascript正则表达式不支持后视。

我认为你需要以艰难的方式做到这一点。将字符串与

之类的字符串匹配
    /(.*)HH(.*)MM(.*)SS(.*)/

然后索引匹配器返回的数组。如果HH / MM / SS可以按任何顺序出现,则可能需要更复杂的正则表达式:

    /(.*?)(?:(HH|MM|SS)(.*?))*/

这是使用非急切匹配和非捕获组。您必须处理诸如“HHMMSS”(即“分隔符”之间没有空格)和“SS one SS”(同一“分隔符”的多个实例)之类的情况。另请注意,这种模式非常危险,因为精心设计的输入可以触发大量的反向跟踪。

答案 2 :(得分:0)

var rx = /^(\d{2})(.*?)(\d{2})(.*?)(\d{2})(.*?)$/
var timeformat = [
    "11 hr : 22 min : 33 sec",
    "11hour:22minute:33second",
    "11h 22m 33s"
];

for (var i = 0; i < timeformat.length; i++) {
    console.log(timeformat[i])
    try {
        for (var j = 0; j < timeformat[i].match(rx).length; j++) {
            console.log('\tmatch['+j+'] = ',timeformat[i].match(rx)[j]);
        }
    } catch(e) {}
}