8

検査される文字列は次のようになります (角かっこの間の空白に注意してください)。

[name]  [address ] [ zip] [ phone number ]

今使っている表現は…

\[([^\])]*)\]

...大括弧内の各テキストを正常にキャプチャしますが、先頭と末尾のスペースも取得するため、次のようになります。

"name"  "address "  " zip"  " phone number "

しかし、私が求めているのは:

"name"  "address"  "zip"  "phone number"

これらの例で正規表現が空白をキャプチャしないようにするにはどうすればよいでしょうか? (「電話番号」の単語間の空白など、埋め込まれた空白は除きます。)

(注:式が完了した、キャプチャされた変数からそれをトリミングできることはわかっていますが、式のコンテキストでそれを実行しようとしています。)

アイデアをありがとう!以下は、これをテストするために使用している正確なコードです。

NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"\\[([^\\])]*)\\]" options:0 error:nil];

NSString *string = @" [name] [address ] [ zip] [ phone number ] ";

NSString *modifiedString = [regex stringByReplacingMatchesInString:string options:0 range:NSMakeRange(0, [string length])
    withTemplate:@"\n\n[$1]"]; //note: adding brackets back here just to make it easy to see if the space has been trimmed properly from the captured value

NSLog(@"\n\n%@", modifiedString);
4

2 に答える 2

3
@"\\[\\s*([^\\]]+?)\\s*\\]"

また

@"\\[ *([^\\]]+?) *\\]"

上記のスペースに注意して入力してください。

これはスペースをキャプチャしません:NSLog出力
[名前]
[アドレス]
[zip]
[電話番号]

「?」先行するメタ文字を貪欲ではなく、貪欲がデフォルトです。

于 2013-02-16T03:29:40.720 に答える
3

これを段階的に進めていきます。

まず、([^\])]*)が間違っています。これは、「] または ) を含まない、可能な限り 0 個以上の文字のシーケンス」を意味します。

たとえば、次の式の場合:

 [name] [address ) ] [ zip] [ phone number ] 

...「アドレス )」が一致しないため、アドレス部分はスキップされます[^\)]]*(つまり、「) と ] を含まない 0 個以上の文字のシーケンス」。

([^\]]*)スキップしない代わりに必要です)。

次に、キャプチャの周囲のすべてのスペースを食べたいと思います。そのため *に、キャプチャの両側に 1 つずつ、2 つのシーケンスを使用します。

\[ *([^\]]*) *\]

今、私たちはトリッキーになる必要があります!デフォルトで[^\]]*は貪欲です。つまり、両側のスペースの一部が一致する可能性があり、キャプチャに含まれる可能性があります! 代わりに、貪欲でないバージョン を使用したいと考えています[^\]]*?]これは、「正規表現の残りの部分に準拠しながら、できるだけ短い0 個以上の文字のシーケンスで、 を含まない」ことを意味します。

\[ *([^\]]*?) *\]

于 2013-02-16T03:11:50.747 に答える