3

私は使用して置き換えよう[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. \最初の文字が2 番目の文字をエスケープすると思うかもしれませんが\、代わりに文字をエスケープしているように見えます... エスケープするように伝え、エスケープしない$ようにするにはどうすればよいですか?\$

4

2 に答える 2

3

試す:

@"\\\\$1"

置換テンプレート用。基本的に:文字列\\をエスケープするため、正規表現に送信されるときです。その後、テンプレート内でエスケープされ、問題が発生します。\@"\$1"\$

于 2012-07-13T22:54:13.190 に答える
1

実際には、次のように 4 つのバックスラッシュが必要です。

@"\\\\$1"

なぜこの扱いにくいシステムが必要なのですか? さて、こう考えてみてください。この\文字は、C エスケープ文字および正規表現エスケープ文字として使用されます。そのため、バックスラッシュを 1 つだけ使用して式を作成すると、エラーが発生する可能性があります。これは、NSString 自体が特殊文字を使用していると判断するためです\$。スラッシュをエスケープするには、最終的な NSString データで 1 つだけに評価される 2 つのスラッシュを使用する必要があります。

ただし、正規表現パーサーに送信するには NSString 自体に 2 つのバックスラッシュが必要なので、文字列リテラル自体で2 つのバックスラッシュをエスケープする必要があります。したがって、実際のデータで\\\\解決さ\\れ、正規表現パーサーは単一のリテラル\文字に折りたたまれます

于 2012-07-13T22:58:08.830 に答える