0

我的代码中有这个方法:

- (void) fullDMXReceived:(NSString*)finalData {

当输入完整的一行<DMX>255,255,255,255,255</DMX>并且该行存储在“finalData”中时调用它。

在将“finalData”发送到解析器之前,我需要一些代码来确定其格式是否正确:

NSArray* allIncomingParseDMX1 = [finalData componentsSeparatedByString:@"<DMX>"];
NSString *parseDMXString1 = [allIncomingParseDMX1 objectAtIndex:1];

NSArray* allIncomingParseDMX2 = [parseDMXString1 componentsSeparatedByString:@"</DMX>"];
NSString *parseDMXString2 = [allIncomingParseDMX2 objectAtIndex:0];

NSArray* allIncoming = [parseDMXString2 componentsSeparatedByString:@","];

[redSlider setStringValue:[allIncoming objectAtIndex:0]];
[greenSlider setStringValue:[allIncoming objectAtIndex:1]];
[blueSlider setStringValue:[allIncoming objectAtIndex:2]];
[strobeSlider setStringValue:[allIncoming objectAtIndex:3]];
[strobeRandomSlider setStringValue:[allIncoming objectAtIndex:4]];
[self controlChange];

有时,finalData 错误地以其他方式出现,而不是<DMX>255,255,255,255,255</DMX>应用程序崩溃时。当 finalData 不是<DMX>255,255,255,255,255</DMX>我只想让它完全忽略它并等待一个好的。

我正在考虑使用符合此条件的 if 语句:

  1. 字符串仅包含 ONE<DMX>且仅包含 ONE </DMX>
  2. 字符串正好包含 4 个“,”
  3. 字符串包含至少 5 个数字 - 在本例中<DMX>0,0,0,0,0</DMX>,并且不超过 15 个数字 - 在本例<DMX>255,255,255,255,255</DMX>中。

我怎样才能做到这一点?

4

2 回答 2

1

在这种情况下,我通常有一些专门用于执行有效性检查的方法。

您可以在此方法中添加尽可能多的检查,并在需要时添加新检查。

遍历您的 finalData,测试每一行的有效性,并且仅在其有效时提取滑块值。

在你的情况下,一个简单的第一次检查是

- (BOOL) validityCheck:(NSString *) testString
{
    if (!testString)
    {
        // Received nil as a parameter, so just bail here.

        return NO;
    }

    BOOL valid = YES;

    // Look for reasons string may be invalid...

    // Check for expected prefix / suffix...

    if (![testString hasPrefix:@"<DMX>"] || ![testString hasSuffix:@"</DMX>"])
    {
        valid = NO;
    }

    // Check number of elements is in valid range...

    int numOfElements = [testString count];

    if (numOfElements >= 5 && numOfElements <= 15)
    {
        valid = NO;
    }

    // Add more tests for validity...

    // And eventually, return the result...

    return valid;
}

您应该在代码中通常添加其中一些技术,因为除了想要检测格式错误的输入之外,您不希望代码在这些情况下崩溃。例如,不要假设当您使用 coponentsSeparatedBy... 提取数组时,它会返回预期数量的元素 - 先检查,然后优雅地处理错误。

于 2012-12-09T14:59:24.083 回答
1

您应该查看NSRegularExpression。并用于Regular Expression匹配您的字符串。

//Generate the RegularExpression: <DMX>((?:(?:25[0-5]|2[0-4]\d|[01]?\d?\d)\,){4}(?:25[0-5]|2[0-4]\d|[01]?\d?\d))</DMX>
NSError *error = NULL;
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"<DMX>((?:(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d)\\,){4}(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d))</DMX>"
                                                                       options:NSRegularExpressionCaseInsensitive
                                                                         error:&error];
//Our test strings
NSString *stringMatch = @"<DMX>255,255,255,255,255</DMX>";
NSString *stringNotMatch = @"<DMX>255,255,255,255,299</DMX>";
NSString *stringNotMatch2 = @"<DMX>0,0,0,0</DMX>";


//Get numberOfMatchesInString
NSUInteger resultA = [regex numberOfMatchesInString:stringMatch
                                            options:0
                                              range:NSMakeRange(0, [stringMatch length])];

NSUInteger resultB = [regex numberOfMatchesInString:stringNotMatch
                                            options:0
                                              range:NSMakeRange(0, [stringNotMatch length])];

NSUInteger resultC = [regex numberOfMatchesInString:stringNotMatch2
                                            options:0
                                              range:NSMakeRange(0, [stringNotMatch2 length])];

//resultA should be 1. resultB should be 0. resultC should be 0.
NSLog(@"ResultA:%d",resultA);
NSLog(@"ResultB:%d",resultB);
NSLog(@"ResultC:%d",resultC);
于 2012-12-09T15:12:57.140 回答