0

我们可以使用 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[0] = "HH"
timeformat[1] = " hr : " <- with spaces (if any)
timeformat[2] = "MM"
timeformat[3] = " min : "
timeformat[4] = "SS"
timeformat[5] = " sec"

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

解决方案: 我能够通过使用正则表达式、拆分和数组创建一个适用于格式字符串的方法来解决该问题。我相信会有更好的解决方案,但我什么也得不到,所以这是我解决问题的方法。我会感谢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;
    }
4

3 回答 3

1

如果我在 Java 中执行此操作,我会从look-aheads 和 look-behinds组成分隔符正则表达式。不幸的是,Javascript 正则表达式不支持后视。

我认为你需要以艰难的方式做到这一点。将字符串与类似的东西匹配

    /(.*)HH(.*)MM(.*)SS(.*)/

然后索引匹配器返回的数组。如果HH//可以以任何顺序出现,等等,您可能需要一个更复杂的正则表达式,如下所示MMSS

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

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

于 2012-05-22T13:19:24.663 回答
1

该函数split()可以将正则表达式作为分隔符。这是一个示例,但我不是正则表达式方面的专家,因此可能不会对其进行优化。

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"]
于 2012-05-22T00:05:30.300 回答
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) {}
}
于 2012-05-22T00:21:54.303 回答