正在检查的字符串类似于以下内容(注意括号之间的空格):
[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);
答案 0 :(得分:3)
@"\\[\\s*([^\\]]+?)\\s*\\]"
或
@"\\[ *([^\\]]+?) *\\]"
小心输入上面的空格。
这不会捕获空格:
NSLog输出
[名]
[地址]
[拉链]
[电话号码]
“?”使前面的元字符非贪婪,贪婪是默认的。
答案 1 :(得分:2)
我将逐步完成这一步。
首先,([^\])]*)
不正确。这意味着“一个0或更多字符的序列,尽可能长,不包含”或)。“
例如,对于这个表达式:
[name] [address ) ] [ zip] [ phone number ]
...地址部分将被跳过,因为“地址”与[^\)]]*
不匹配(这意味着“零个或多个字符的序列,不包括在内)和]。”
我们想要([^\]]*)
代替,但不会跳过。
接下来,我们想吃掉捕获周围的所有空间。为此,我们使用两个 *
序列,在捕获的每一侧都有一个:
\[ *([^\]]*) *\]
现在我们需要变得棘手!默认情况下[^\]]*
是贪婪的。这意味着任何一方的某些空间可能会被它匹配,因此包含在捕获中!我们想要使用非贪婪版本[^\]]*?
。这意味着“一个0或更多字符的序列,不包含]
,尽可能短,同时符合正则表达式的其余部分。”
\[ *([^\]]*?) *\]