我基本上期待一个字符串形式为\ w +:\ w +或\ w +:\ w +:\ w +。我制作了一个可以单独匹配每个案例的正则表达式...
NSRegularExpression *individualConstraintRegex = [NSRegularExpression regularExpressionWithPattern:@"^(\\w+?):(\\w+?)$" options:0 error:NULL];
和
NSRegularExpression *individualConstraintRegex = [NSRegularExpression regularExpressionWithPattern:@"(^\\w+?):(\\w+?):(\\w+?)$" options:0 error:NULL];
但是我尝试使用' |'实现OR效果的符号,但它不起作用。
NSRegularExpression *individualConstraintRegex = [NSRegularExpression regularExpressionWithPattern:@"^(\\w+?):(\\w+?):(\\w+?)$|^(\\w+?):(\\w+?)$" options:0 error:NULL];
我确定解决方案很简单,有什么想法吗?
答案 0 :(得分:3)
你的表达式在错误的子表达式之间放置一个OR,即$|^
是" OR"在^
和$
之间,无法进行任何匹配。
使用括号进行正确的分组:
NSRegularExpression *individualConstraintRegex = [NSRegularExpression
regularExpressionWithPattern:@"^(?:(\\w+?):(\\w+?):(\\w+?))|(?:(\\w+?):(\\w+?))$"
options:0
error:NULL
];
(?:...)
是非捕获括号。它们对表达式的各个部分进行分组,而无需创建新的捕获组。我还将公共锚^
和$
移到括号外。
请注意,由于:
不是一个单词字符,您可以删除不情愿的限定符?
,然后使用+
。另一种选择是使第三个:\\w+
部分可选,如下所示:
NSRegularExpression *individualConstraintRegex = [NSRegularExpression
regularExpressionWithPattern:@"^(\\w+)[:](\\w+)(?:[:](\\w+))?$"
options:0
error:NULL
];
为了便于阅读,我在列中添加了[:]
。它们不是必需的。