正在检查的字符串类似于以下内容(注意括号之间的空格):
[name] [address ] [ zip] [ phone number ]
我现在使用的表达方式...
\[([^\])]*)\]
...成功捕获括号内的每个文本,但它也捕获前导和尾随空格,所以我最终得到:
"name" "address " " zip" " phone number "
但我追求的是:
"name" "address" "zip" "phone number"
如何说服正则表达式不捕获这些示例中的空格? (嵌入的空白除外 - 例如“电话号码”中单词之间的空白。)
(注意:我知道我可以从捕获的变量中修剪它after表达已经完成,但我正在尝试这样做within表达式的上下文。)
感谢您的任何想法!下面是我用来测试这个的确切代码:
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 个或多个字符组成的序列,尽可能长,不包含 ] 或 )。
例如,对于这个表达式:
[name] [address ) ] [ zip] [ phone number ]
...地址部分将被跳过,因为“地址 )”不匹配[^\)]]*
(这意味着“零个或多个字符的序列,不包括)和]”。
We want ([^\]]*)
相反,这不会跳过)。
接下来,我们要吃掉捕获周围的所有空间。为此,我们使用两个 *
序列,捕获的每一侧都有一个:
\[ *([^\]]*) *\]
现在我们需要变得棘手!这[^\]]*
默认是贪婪的。这意味着两侧的一些空间可能与其匹配,从而包含在捕获中!我们想使用非贪婪版本,[^\]]*?
, 反而。这意味着“0 个或多个字符的序列,不包含]
,尽可能短,同时符合正则表达式的其余部分。”
\[ *([^\]]*?) *\]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)