1

我有包含时间值的字符串,例如 08:30:00AM 和/或 12:45:00PM 等。现在我需要删除这些字符串中包含“秒”值的部分,以制作像 08:30AM 和/或这样的上部字符串下午 12:45 等。我不能使用 NSDateFormatter,因为字符串不必总是在 HH:MM:SS 值中包含时间字符串。可能还有其他任何字符串值。这就是为什么我必须通过模式匹配来做到这一点.

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

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);

提前致谢..

4

2 回答 2

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); 

输出:上午 8 点 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);
于 2013-04-29T11:57:23.507 回答
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 AM 的文本,用于测试这两种格式。

替换字符串中的$n(其中 n 是数字)指的是正则表达式模式中的第 n 个捕获组(括号)——在这种情况下是小时、冒号和分钟。

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

顺便说一句,这种模式中没有字母,所以你不需要NSRegularExpressionCaseInsensitive.

这个站点很有用,例如关于替换字符串和高级语法的讨论。

于 2013-04-29T14:13:39.333 回答