2013-04-29 13 views
1

我的字符串包含时间值,如08:30:00 AM和/或12:45:00 PM等 现在我需要的是删除包含'秒'值的部分在这些字符串中使上部字符串像上午08:30 AM和/或下午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); 

在此先感谢..

回答

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

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

+0

谢谢你的你已经提供了很好的答案...这就是我想要的..它处理我所有的场景.. :-) – 2013-04-30 04:24:39

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

编辑:

Alter内特方式:

如果你确信你的时间总是在给定的格式为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); 
+0

感谢您的回答。但它是一个字符串,它必须显示在UILabel上..所以,我需要使用正则表达式替换字符串.. – 2013-04-29 12:01:49

+0

你真的需要正则表达式吗?看到编辑的答案,你得到'outputTime'中的字符串,你可以显示在uilabel – 2013-04-29 12:04:27

+0

让我检查它。如果这工作或没有.. – 2013-04-29 12:07:19