4

我有一个可以采用以下格式的字符串(数字是示例):

2h34m2s
23m6s
7h8s
4h2m
3h
2m
2s

我最初打算只使用split()正则表达式来匹配h,ms. 但是,如果只有一些指标存在(如果它的形式是2m3s,那么我需要一种方法来知道数组中的第一个条目代表分钟而不是小时)。

我认为正确的解决方案将涉及某种正则表达式,但它目前使我无法理解。任何关于清洁高效解决方案的想法?

编辑:

(我想接受任意数量的数字,所以我没有{1,2}在正则表达式中使用。

var timeString = $('#interval').val();
var hours = timeString.match('/\d+(?=h)/')[0];     // 2h4m8s
var minutes = timeString.match('/\d+(?=m)/')[0];
var seconds = timeString.match('/\d+(?=s)/')[0];
console.log('hours: ' + hours);
console.log('minutes: ' + minutes);
console.log('seconds: ' + seconds);

控制台正在给出null这些值。

4

4 回答 4

2

您可以使用以下正则表达式:

\d+(?=m)几分钟,

\d+(?=h)几个小时,和

\d+(?=s)几秒钟。

您可能应该进行不区分大小写的匹配。

于 2013-04-13T18:45:20.940 回答
2
var string = "23h4m"
var regexp = /(\d+h)?(\d+m)?(\d+s)?/;
var result = string.match(regexp) // gives you ["23h4m", "23h", "4m", undefined]

您可以使用result[1]小时、result[2]分钟和result[3]秒来访问结果。如果没有给出,这些值是未定义的。

于 2013-04-13T18:53:35.097 回答
1

您可以在此处使用具有正面预测的正则表达式:

/\d{1,2}(?=h)/

将匹配小时:后跟字母时的一位或两位数字h。类似于ms

于 2013-04-13T18:48:32.430 回答
1
//match any digits and include the letters

var rx=/((\d+)(h|m|s))/g;    

//test:
var str1='2h34m2s',str2='23m6s';

str1+'=\n\t'+str1.match(rx).join(':\n\t')+'\n'+
str2+'=\n\t'+str2.match(rx).join(':\n\t')
//returns

2h34m2s=
    2h:
    34m:
    2s
23m6s=
    23m:
    6s
于 2013-04-13T19:07:19.517 回答