能否使用单个NSRegularExpression同时校验字符串格式并提取子串?
NSRegularExpression能否同时校验格式并提取所有单词?
结论
可以用单个正则完成,但你之前遇到的问题是正则引擎的固有特性,不是操作错了。
为什么原来的正则不行?
你写的^((\w+) ?)+\.$里,(\w+)这个捕获组被包在重复的分组中。正则引擎处理这种重复捕获组时,只会保留最后一次匹配的内容,所以只能拿到最后一个单词LastWord,之前的Word1、word2会被覆盖。这是包括NSRegularExpression依赖的ICU引擎在内,大多数正则引擎的通用行为,属于正则本身的局限性。
单个正则的实现方法
要同时完成校验和提取,无需写两个正则,复用同一个实例即可:
- 格式校验:用匹配整行的正则判断格式合法,比如简化成
^\w+(?: \w+)+\.$,这里的(?:...)是非捕获组,仅用于格式匹配,不会生成多余的捕获结果。 - 提取单词:确认格式合法后,用同一个正则实例全局匹配
\w+,就能提取出所有单词。
或者也可以直接用带正向预查的正则,先确保整行格式合规,再提取单词:
(?=^\w+(?: \w+)+\.$)\w+
开启全局匹配这个正则,若能获取到所有单词,则说明格式合法,实现校验与提取一步完成。
小提示
NSRegularExpression默认仅匹配第一个符合要求的内容,所以提取单词时要开启全局匹配模式(设置NSRegularExpressionOptions中的withoutAnchoringBounds选项,或遍历所有匹配结果)。
内容的提问来源于stack exchange,提问作者Andrei Herford
相关产品推荐
相关产品推荐

