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

我将逐步完成此操作。

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

例如,对于这个表达式:

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

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

相反,我们想要([^\]]*),它不会跳过)。

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

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

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

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

于 2013-02-16T03:11:50.747 回答
3
@"\\[\\s*([^\\]]+?)\\s*\\]"

或者

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

小心输入上面的空格。

这不会捕获空格: NSLog output
[name]
[address]
[zip]
[phone number]

这 ”?” 使前面的元字符非贪婪,贪婪是默认值。

于 2013-02-16T03:29:40.720 回答