如何从正则表达式捕获组中修剪空白?

Mon*_*urd 8 regex objective-c

被检查的字符串类似于以下内容(注意括号之间的空格):

[name]  [address ] [ zip] [ phone number ]
Run Code Online (Sandbox Code Playgroud)

我目前使用的表达方式......

\[([^\])]*)\]
Run Code Online (Sandbox Code Playgroud)

...成功捕获括号内的每个文本,但它也抓住了前导和尾随空格,所以我最终得到:

"name"  "address "  " zip"  " phone number "
Run Code Online (Sandbox Code Playgroud)

但我寻求的是:

"name"  "address"  "zip"  "phone number"
Run Code Online (Sandbox Code Playgroud)

在这些例子中,正则表达式如何被说服不捕获空白?(嵌入的空格除外 - 例如"电话号码"中的单词之间的空格.)

(注:我知道我可以只从捕获的变量修剪的表现做,但我试图做到这一点表达的情况下).

谢谢你的任何想法!下面是我用来测试这个的确切代码:

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);
Run Code Online (Sandbox Code Playgroud)

Ste*_*her 5

我将一步一步地完成这个过程。

\n\n

首先,这([^\\])]*)是不正确的。这意味着“由 0 个或多个字符组成的序列,尽可能长,不包含 ] 或 )。

\n\n

例如,对于这个表达式:

\n\n
 [name] [address ) ] [ zip] [ phone number ] \n
Run Code Online (Sandbox Code Playgroud)\n\n

...地址部分将被跳过,因为“地址 )”不匹配[^\\)]]*(这意味着“零个或多个字符的序列,不包括 ) 和]。”

\n\n

我们想要([^\\]]*)的是,这不会跳过)。

\n\n

接下来,我们要吃掉捕获周围的所有空间。为此,我们使用两个\xc2\xa0*序列,捕获的每一侧各一个:

\n\n

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

\n\n

现在我们需要变得棘手!默认情况下是[^\\]]*贪婪的。这意味着两侧的一些空间可能与其匹配,从而包含在捕获中!我们想使用非贪婪版本 ,[^\\]]*?来代替。这意味着“0 个或多个字符的序列,不包含],尽可能短,同时符合正则表达式的其余部分”。

\n\n

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

\n