Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.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
Ios NSString正则表达式查找和替换_Ios_Objective C_Regex - Fatal编程技术网

Ios NSString正则表达式查找和替换

Ios NSString正则表达式查找和替换,ios,objective-c,regex,Ios,Objective C,Regex,构建需要在UIWebView对象中显示某些HTML字符串的iOS应用程序。我试图搜索,找到一个模式,并替换为一个图像的正确链接。图像链接是像[pic:brand:123]这样的原始链接,其中pic始终是pic,brand可以是任何字母数字,123也可以是任何非空白字母数字 到目前为止,我已经尝试了一些方法,包括: NSString *pattern = @"\\[pic:([^\\s:\\]]+):([^\\]])\\]"; 但到目前为止,还没有一个成功 下面是一个示例代码: NSString

构建需要在UIWebView对象中显示某些HTML字符串的iOS应用程序。我试图搜索,找到一个模式,并替换为一个图像的正确链接。图像链接是像
[pic:brand:123]
这样的原始链接,其中
pic
始终是
pic
brand
可以是任何字母数字,
123
也可以是任何非空白字母数字

到目前为止,我已经尝试了一些方法,包括:

NSString *pattern = @"\\[pic:([^\\s:\\]]+):([^\\]])\\]";
但到目前为止,还没有一个成功

下面是一个示例代码:

NSString *str = @"veryLongHTMLSTRING";
NSLog(@"Original test: %@",[str substringToIndex:500]);
NSError *error = nil;
// use regular expression to replace the emoji
NSRegularExpression *regex = [NSRegularExpression
                                  regularExpressionWithPattern:@"\\[pic:([^\\s:\\]]+):([^\\]])\\]"
                                  options:NSRegularExpressionCaseInsensitive error:&error];
if(error != nil){
    NSLog(@"ERror: %@",error);
}else{
    [regex stringByReplacingMatchesInString:str
                                    options:0
                                      range:NSMakeRange(0, [str length])
                               withTemplate:[NSString stringWithFormat:@"/%@/photo/%@.gif",
                                             IMAGE_BASE_URL, @"$1/$2"]];

NSLog(@"Replaced test: %@",[str substringToIndex:500]);

我看到两个错误:regex模式的第二个捕获组中缺少一个
+
,应该是

NSString *pattern = @"\\[pic:([^\\s:\\]]+):([^\\]]+)\\]";
stringbyreplacingmatcheinstall
返回一个新字符串,它不会替换匹配的字符串。因此,您必须将结果分配给一个新字符串,或者将
replaceMatcheInstalling:options:range:withTemplate:
NSMutableString
一起使用

下面是修改过的代码

NSString *pattern = @"\\[pic:([^\\s:\\]]+):([^\\]]+)\\]";
NSString *str = @"bla bla [pic:brand:123] bla bla";
NSLog(@"Original test: %@",str);
NSError *error = nil;
NSRegularExpression *regex = [NSRegularExpression
                              regularExpressionWithPattern:pattern
                              options:NSRegularExpressionCaseInsensitive error:&error];
if(error != nil){
    NSLog(@"ERror: %@",error);
} else{
    NSString *replaced = [regex stringByReplacingMatchesInString:str
                                    options:0
                                      range:NSMakeRange(0, [str length])
                               withTemplate:[NSString stringWithFormat:@"/%@/photo/%@.gif",
                                             @"IMAGE_BASE_URL", @"$1/$2"]];

    NSLog(@"Replaced test: %@",replaced);
}
产生输出

原始测试:bla bla[图片:品牌:123]bla bla bla
替换测试:bla bla/IMAGE_BASE_URL/photo/brand/123.gif bla bla bla

我看到两个错误:regex模式的第二个捕获组中缺少一个
+
,应该是

NSString *pattern = @"\\[pic:([^\\s:\\]]+):([^\\]]+)\\]";
stringbyreplacingmatcheinstall
返回一个新字符串,它不会替换匹配的字符串。因此,您必须将结果分配给一个新字符串,或者将
replaceMatcheInstalling:options:range:withTemplate:
NSMutableString
一起使用

下面是修改过的代码

NSString *pattern = @"\\[pic:([^\\s:\\]]+):([^\\]]+)\\]";
NSString *str = @"bla bla [pic:brand:123] bla bla";
NSLog(@"Original test: %@",str);
NSError *error = nil;
NSRegularExpression *regex = [NSRegularExpression
                              regularExpressionWithPattern:pattern
                              options:NSRegularExpressionCaseInsensitive error:&error];
if(error != nil){
    NSLog(@"ERror: %@",error);
} else{
    NSString *replaced = [regex stringByReplacingMatchesInString:str
                                    options:0
                                      range:NSMakeRange(0, [str length])
                               withTemplate:[NSString stringWithFormat:@"/%@/photo/%@.gif",
                                             @"IMAGE_BASE_URL", @"$1/$2"]];

    NSLog(@"Replaced test: %@",replaced);
}
产生输出

原始测试:bla bla[图片:品牌:123]bla bla bla
替换测试:bla bla/IMAGE_BASE_URL/photo/brand/123.gif bla bla bla

您误解了模板应该如何形成。另外,
stringbyreplacingmatcheinstall
不会更改原始字符串。试试这个(测试):


你误解了模板应该如何形成。另外,
stringbyreplacingmatcheinstall
不会更改原始字符串。试试这个(测试):


你希望最终的结果是什么?我希望
[pic:brand:123]
/photo/brand/123.gif
。不过,品牌在这里是通用的。它可能介于众多选项之间。您希望最终结果是什么?我希望
[pic:brand:123]
/photo/brand/123.gif
。不过,品牌在这里是通用的。它可以在众多选项之间进行选择。你绝对正确,该死的,我需要停止过度工作我的眼睛!非常感谢@shawndreck也可以查看我的解决方案。:)你完全正确,该死,我需要停止过度工作我的眼睛!非常感谢@shawndreck也可以查看我的解决方案。:)谢谢你的提醒。但我把模板搞混了什么?我不应该用这个[NSString stringWithFormat:..?@ShawnRECK No.这是不必要的。模板本身就是一种格式。
/photo/$1/$2.gif
告诉正则表达式对象替换第一个组以代替
$1
,等等。我使用stringWithFormat的原因是能够包含在某个地方定义的NSString常量
IMAGE\u BASE\u URL
我的代码更复杂。我不能简单地做
/IMAGE\u BASE\u URL/photo/…
,因为这只会在我的链接中添加文字
IMAGE\u BASE\u URL
。这肯定不是我想要的。但我理解你所说的。@shawnreck我知道你对IMAGE\u BASE\u URL的看法。但是,没有必要在“$1/$2”中替换通过字符串格式化。它不会更改。将其从变量args中取出。将其移动到格式字符串。
[NSString stringWithFormat:@/%@/photo/$1/$2.gif],@“IMAGE\u BASE\u URL”]
保持简单。谢谢提醒。但我对模板有什么误解?我不应该使用它[NSString stringWithFormat:..?@ShawnRECK No.这是不必要的。模板本身就是一种格式。
/photo/$1/$2.gif
告诉正则表达式对象替换第一个组以代替
$1
,等等。我使用stringWithFormat的原因是能够包含在某个地方定义的NSString常量
IMAGE\u BASE\u URL
我的代码更复杂。我不能简单地做
/IMAGE\u BASE\u URL/photo/…
,因为这只会在我的链接中添加文字
IMAGE\u BASE\u URL
。这肯定不是我想要的。但我理解你所说的。@shawnreck我知道你对IMAGE\u BASE\u URL的看法。但是,没有必要在“$1/$2”中替换通过字符串格式化。它不会更改。将其从变量args中取出。将其移动到格式字符串。
[NSString stringWithFormat:@/%@/photo/$1/$2.gif”,@“IMAGE\u BASE\u URL”]
保持简单。