Regex 从Objective-C中的字符串中提取数字和运算符
我有这个字符串Regex 从Objective-C中的字符串中提取数字和运算符,regex,string,nsmutablearray,nsarray,Regex,String,Nsmutablearray,Nsarray,我有这个字符串(2.5+1)*5 我想创建一个NSMutableArray,其中包含以下每个元素: [(,2.5,+,1,),*,5] 这是我写的代码: + (NSMutableArray*) convertToList: (NSString *) exp { NSRegularExpression * reg = [NSRegularExpression regularExpressionWithPattern: @"(\\d+\\.\\d+)|(\\d+)|([+-/*///^])|
(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}"
)
(
“{0,1}{(\\d+\\.\\d+)|(\\d+)|([+-/*/^])|([/(/)])0x0}”,
“{1,1}{(\\d+\\.\\d+)|(\\d+)|([+-/*/^])|([/(/)])0x0}”,
“{2,1}{(\\d+\\.\\d+)|(\\d+)|([+-/*/^])|([/(/)])0x0}”,
“{3,1}{(\\d+\\.\\d+)|(\\d+)|([+-/*/^])|([/(/)])0x0}”,
“{4,1}{(\\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;
}
publicstaticarraylistconverttolist(字符串exp){
字符串regex=“(\\d+\\.\\d+)”(\\d+)([+-/*/^]))|([/(/)])”;
matcherm3=Pattern.compile(regex).Matcher(exp);
ArrayList list=新的ArrayList(exp.length());
while(m3.find()){
list.add(m3.group());
}
退货清单;
}
这是可行的,但我不能在Objective-c中翻译它您应该使用正则表达式模式
(\\d+\\.?\\d*|\\.\\d+|[^\\d.])
Java代码:
输出:
检查此代码也许您需要一个数学解析器。
检查我找到了解决方案,错误是因为我不知道如何处理结果,返回的NSArray由NSTextCheckInResult组成,我必须使用它来提取数字和运算符
+ (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;
}
正如在另一个回答中提到的,我们可以很容易地做到这一点。看起来您并不关心实际术语的层次结构,因此您可以只使用生成的标记。这很简单:
NSError *error = nil;
DDMathStringTokenizer *tokenizer = [[DDMathStringTokenizer alloc] initWithString:@"(2.5+1)*5" error:&error];
NSArray *tokens = [tokenizer tokens];
tokens = [tokens valueForKey:@"token"];
NSLog(@"%@", tokens);
DDMathStringTokenizer
上的-tokens
方法返回DDMathStringToken
对象的数组。这些对象具有实际令牌的底层NSString
(通过token
属性访问),因此需要对数组进行valueForKey:
调用以将其转换为字符串数组。但如果您这样做,则会记录以下内容:
(
"(",
"2.5",
"+",
1,
")",
"*",
5
)
我收到一个警告:未知转义序列\。我认为正则表达式不是问题所在,它在Java@AR89-检查我答案中的演示链接。代码应该在没有警告的情况下运行。@AR89-演示是针对Java环境的。我不确定,但可能Objective-c正则表达式只使用了一个转义斜杠,所以尝试使用正则表达式模式
(\d+\.?\d*.\d*.[^\d.])
和Objective-c。你的正则表达式和我的正则表达式都没有错,它们都很好,看看我的答案。谢谢你,顺便说一句@AR89-我很高兴你找到了解决办法:)祝你好运!
NSError *error = nil;
DDMathStringTokenizer *tokenizer = [[DDMathStringTokenizer alloc] initWithString:@"(2.5+1)*5" error:&error];
NSArray *tokens = [tokenizer tokens];
tokens = [tokens valueForKey:@"token"];
NSLog(@"%@", tokens);
(
"(",
"2.5",
"+",
1,
")",
"*",
5
)