0

正規表現を使用して、次の形式で文字列を解析しようとしています。

"Key" = "Value";

次のコードは、「キー」と「値」を抽出するために使用されます。

NSString* pattern = @"([\"\"'])(?:(?=(\\\\?))\\2.)*?\\1";
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:pattern
                                                                       options:0
                                                                         error:NULL];
NSRange matchRange = NSMakeRange(0, line.length);
NSTextCheckingResult *match = [regex firstMatchInString:line options:0 range:matchRange];
NSRange rangeKeyMatch = [match rangeAtIndex:0];

matchRange.location = rangeKeyMatch.length;
matchRange.length = line.length - rangeKeyMatch.length;
NSTextCheckingResult *match2 = [regex firstMatchInString:line options:0 range:matchRange];
NSRange rangeValueMatch = [match2 rangeAtIndex:0];

効率的に見えず、次の例を無効とは見なしていません。

"key" = "value" = "something else";

この種の解析の解析を実行する効率的な方法はありますか?

4

2 に答える 2

1

私はその方言に精通していませんが、あなたがタグ付けregexしたので、原則としてそれを行うべきものは次のとおりです。^"([^"]*)" = "([^"]*)";$

形式について正確ではないため、入力形式に応じて、条件付きの空白をあちこちに追加する必要がある場合があります。もう 1 つ考えられるのは、括弧をエスケープする必要があることです。

たとえばsed、次のように記述する必要があります。

echo '"Key" = "Value";' | sed -e 's#^"\([^"]*\)" = "\([^"]*\)";$#key is \1 and value is \2#'

于 2013-09-05T09:55:21.503 に答える
1

このコードは一致する必要が"key" = "value"あり"key" = "value" = "something else"ます。

NSString *line = @"\"key\" = \"value\"";

NSError *error = NULL;
NSString *pattern = @"\\\"(\\w+)\\\"\\s=\\s\\\"(\\w+)\\\"$";
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:pattern
                                                                       options:NSRegularExpressionAnchorsMatchLines error:&error];
NSRange matchRange = NSMakeRange(0, line.length);
NSTextCheckingResult *match = [regex firstMatchInString:line options:0 range:matchRange];

/* It looks like you were not quite looking at the ranges properly. The rangeAtIndex 0 is actually the entire string. */
NSRange rangeKeyMatch = [match rangeAtIndex:1];
NSRange rangeValueMatch = [match rangeAtIndex:2];

NSLog(@"Key: %@, Value: %@", [line substringWithRange:rangeKeyMatch], [line substringWithRange:rangeValueMatch]);
于 2013-09-05T11:28:46.380 に答える