Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 从Objective-C中的字符串中提取数字和运算符_Regex_String_Nsmutablearray_Nsarray - Fatal编程技术网

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
)