1

私はこの文字列を持っています(2.5+1)*5

各要素を含む NSMutableArray を作成したい: [(, 2.5, +, 1, ), *, 5]

これは私が書いたコードです:

+ (NSMutableArray*) convertToList: (NSString *) exp {
    NSRegularExpression * reg = [NSRegularExpression regularExpressionWithPattern: @"(\\d+\\.\\d+)|(\\d+)|([+-/*///^])|([/(/)])" options:0 error:nil];
    NSArray *matches = [ reg matchesInString: exp
                                 options: 0
                                   range:NSMakeRange(0, [exp length])];
    return [matches mutableCopy];
}

int main (int argc, char *argv[]) {
    NSString * exp = @"(2+5)";
    NSMutableArray * array = [ExpressionTexting convertToList:exp];
    NSLog(@"%@", array);
}

私はこの出力を得ます:

(
"<NSExtendedRegularExpressionCheckingResult: 0x10010d2e0>{0, 1}{<NSRegularExpression: 0x10010abb0> (\\d+\\.\\d+)|(\\d+)|([+-/*///^])|([/(/)]) 0x0}",
"<NSExtendedRegularExpressionCheckingResult: 0x10010d3f0>{1, 1}{<NSRegularExpression: 0x10010abb0> (\\d+\\.\\d+)|(\\d+)|([+-/*///^])|([/(/)]) 0x0}",
"<NSExtendedRegularExpressionCheckingResult: 0x10010d470>{2, 1}{<NSRegularExpression: 0x10010abb0> (\\d+\\.\\d+)|(\\d+)|([+-/*///^])|([/(/)]) 0x0}",
"<NSExtendedRegularExpressionCheckingResult: 0x10010d4f0>{3, 1}{<NSRegularExpression: 0x10010abb0> (\\d+\\.\\d+)|(\\d+)|([+-/*///^])|([/(/)]) 0x0}",
"<NSExtendedRegularExpressionCheckingResult: 0x10010d570>{4, 1}{<NSRegularExpression: 0x10010abb0> (\\d+\\.\\d+)|(\\d+)|([+-/*///^])|([/(/)]) 0x0}"
)

Javaで答えを得ました:

public static ArrayList<String> convertToList(String exp){
    String regex = "(\\d+\\.\\d+)|(\\d+)|([+-/*///^])|([/(/)])";
    Matcher m3 = Pattern.compile(regex).matcher(exp);
    ArrayList<String> list = new ArrayList<String>(exp.length());
    while (m3.find()) {
        list.add(m3.group());
    }
    return list;
}

これは機能しますが、Objective-c で翻訳することはできません

4

4 に答える 4

1

正規表現パターンを使用する必要があります

(\\d+\\.?\\d*|\\.\\d+|[^\\d.])

Javaコード:

String str = "(2.5+1)*5";
Pattern p = Pattern.compile("(\\d+\\.?\\d*|\\.\\d+|[^\\d.])");
Matcher m = p.matcher(str);
while (m.find()) {
    String match = m.group();
    System.out.println(match);
}

出力:

(
2.5
+
1
)
*
5

ここでこのコードを確認してください。

于 2012-10-14T16:01:35.187 に答える
1

数学パーサーが必要かもしれません。DDMathParserを確認してください

于 2012-10-14T16:15:44.133 に答える
1

私は解決策を見つけました。エラーは、結果を処理する方法が本当にわからなかったという事実によるものでした。返された NSArray は、数値と演算子を抽出するために使用する必要がある NSTextCheckingResult で構成されています。

+ (NSMutableArray*) convertToList: (NSString *) exp {
NSRegularExpression * reg = [NSRegularExpression regularExpressionWithPattern: @"(\\d+\\.\\d+)|(\\d+)|([+-/*///^])|([/(/)])" options:0 error:nil];
NSArray *matches = [ reg matchesInString: exp
                                 options: 0
                                   range:NSMakeRange(0, [exp length])];

NSMutableArray *mArray = [[NSMutableArray alloc] init];
for (NSTextCheckingResult *match in matches) {
    NSString* matchText = [exp substringWithRange:[match range]];
    [mArray addObject:matchText];
    //NSLog(@"%@", matchText);
}

return mArray;
}
于 2012-10-14T16:54:58.753 に答える
0

別の回答でほのめかされたように、DDMathParserこれは非常に簡単に行うことができます。実際の用語の階層を気にしていないように見えるので、結果のトークンを使用するだけで済む可能性があります。簡単だ:

    NSError *error = nil;
    DDMathStringTokenizer *tokenizer = [[DDMathStringTokenizer alloc] initWithString:@"(2.5+1)*5" error:&error];
    NSArray *tokens = [tokenizer tokens];
    tokens = [tokens valueForKey:@"token"];
    NSLog(@"%@", tokens);

-tokenson メソッドは、オブジェクトのDDMathStringTokenizer配列を返しDDMathStringTokenます。これらのオブジェクトには、 (プロパティNSStringを介してアクセスされる) 実際のトークンの基盤があるため、配列を呼び出して文字列の配列に変換する必要があります。ただし、これを行うと、次のログが記録されます。tokenvalueForKey:

(
    "(",
    "2.5",
    "+",
    1,
    ")",
    "*",
    5
)
于 2012-10-22T02:30:23.027 に答える