我有这个字符串(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
中进行翻译答案 0 :(得分:1)
你应该使用正则表达式
(\\d+\\.?\\d*|\\.\\d+|[^\\d.])
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
检查此代码 here 。
答案 1 :(得分:1)
也许你需要一个数学解析器。 检查DDMathParser
答案 2 :(得分:1)
我找到了解决方案,错误是因为我真的不知道如何处理结果,返回的NSArray是由NSTextCheckingResult构成的,我必须使用它来提取数字和运算符。 / p>
+ (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;
}
答案 3 :(得分: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);
-tokens
上的DDMathStringTokenizer
方法返回DDMathStringToken
个对象的数组。这些对象具有实际令牌的基础NSString
(通过token
属性访问),因此您需要对数组进行valueForKey:
调用以将其转换为字符串数组。但如果你这样做,那么你就会记录下来:
(
"(",
"2.5",
"+",
1,
")",
"*",
5
)