我们可以使用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;
}
答案 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) {}
}