Ios NSString正则表达式查找和替换
构建需要在UIWebView对象中显示某些HTML字符串的iOS应用程序。我试图搜索,找到一个模式,并替换为一个图像的正确链接。图像链接是像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
[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”]
保持简单。