我正在尝试使用[word]
将\[word\]
替换为NSRegularExpression
:
NSRegularExpression *metaRegex = [NSRegularExpression regularExpressionWithPattern:@"([\\[\\]])"
options:0
error:&metaRegexError];
NSString *escapedTarget = [metaRegex stringByReplacingMatchesInString:string
options:0
range:NSMakeRange(0, string.length)
withTemplate:@"\\$1"];
但是这个输出是$1word$1
。您会认为第一个\
将逃脱第二个\
字符,但它看起来像是在逃避$
字符...我如何告诉它逃脱\
和不是$
?
答案 0 :(得分:3)
尝试:
@"\\\\$1"
替换模板。基本上:\\
将转义字符串的\
,因此当它被发送到正则表达式时它是@"\$1"
。然后,\
会转义模板中的$
,从而导致您的问题。
答案 1 :(得分:0)
你实际上需要四个反斜杠,如下所示:
@"\\\\$1"
为什么需要这种笨拙的系统?好吧,这样想吧。 \
字符用作C转义字符和正则表达式转义字符。因此,如果您创建一个只有一个反斜杠的表达式,则可能会出现错误,因为NSString本身就会使用特殊字符\$
。要转义斜杠,需要使用两个斜杠,它将在最终的NSString数据中仅计算为一个斜杠。
但是,您确实需要在NSString中将两个反斜杠发送到正则表达式解析器,因此您需要在字符串文本本身中转义两个反斜杠。因此,\\\\
在实际数据中解析为\\
,然后正则表达式解析器折叠为单个文字\
字符