修改长字符串中时间格式正则表达式的出现次数

时间:2013-04-29 11:53:36

标签: ios regex xcode nsstring nsregularexpression

我的字符串包含时间值,如08:30:00 AM和/或12:45:00 PM等。 现在我需要的是删除这些字符串中包含'秒'值的部分,以使上部字符串像上午08:30和/或下午12:45等。 我不能使用NSDateFormatter,因为字符串总是包含HH:MM:SS值中的时间字符串没有必要。可能有任何字符串值。这就是为什么我必须通过patttern匹配来完成它。

我知道,我可以使用以下代码。但我需要知道的是查找和修改字符串的正则表达式是什么。

NSString *string = @"string containing 08:30:00AM values and some text";
NSError *error = NULL;
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"???" options:NSRegularExpressionCaseInsensitive error:&error];
NSString *modifiedString = [regex stringByReplacingMatchesInString:string options:0   range:NSMakeRange(0, [string length]) withTemplate:@""];
NSLog(@"%@", modifiedString);

提前致谢..

2 个答案:

答案 0 :(得分:3)

如果是时候,那么你可以使用dateformatter:

NSString *string = @"08:30:00AM"; //This is your input time

NSDateFormatter *df=[NSDateFormatter new];
[df setDateFormat:@"hh:mm:ssa"];
NSDate *nowTime=[df dateFromString:string];    
[df setDateFormat:@"hh:mma"];
NSString *outputTime=[df stringFromDate:nowTime];

NSLog(@"time is : %@",outputTime); 
  

输出:08:30

编辑:

替代方式:

如果您确定您的时间始终采用给定格式08:30:00AM08:30:05AM,那么您可以使用:

NSString *string = @"08:30:00AM";

NSString *aMPM=[string substringFromIndex:string.length-2];
NSString *noSecondAMPM= [string substringToIndex:string.length-5];
NSString *myTime=[NSString stringWithFormat: @"%@%@",noSecondAMPM,aMPM];

NSLog(@"time is : %@",myTime);

答案 1 :(得分:1)

只是为了回答你自己的问题,这个正则表达式模式将匹配你所用的时间格式,括号将捕获小时和分钟部分,并允许你将它们保存在修改后的字符串中:

NSString *timeText = @"This is a text with 08:30:23 and 9:23:54AM to test both formats.";

NSString *timePattern = @"([0-9]{1,2}:[0-9]{2}):[0-9]{2}";

NSError *error = NULL;
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:timePattern
                                                                       options:0
                                                                         error:&error];

NSString *modifiedString = [regex stringByReplacingMatchesInString:timeText
                                                           options:0
                                                             range:NSMakeRange(0, timeText.length)
                                                      withTemplate:@"$1"];

结果如下:

  

这是一篇文章,上午08:30和9:23测试这两种格式。

替换字符串中的$n(其中n是数字)是指正则表达式模式中的第n个捕获组(括号) - 在本例中是小时,冒号和分钟。

正如您自己提到的,使用正则表达式可以直接在文本中进行替换,无需进一步解析。

顺便说一句,此模式中没有字母,因此您不需要NSRegularExpressionCaseInsensitive

site非常有用,例如关于替换字符串和高级语法的讨论。