如何解决如何在 Swift NSRegularExpression 中捕获单词边界?
我想捕获以某个前缀开头的字符串中的所有单词。例如,所有以 t
if let regex = try? NSRegularExpression(pattern: #"t[^ ]+"#,options: NSRegularExpression.Options.caseInsensitive) {
let input = "this is the best test"
let matches = regex.matches(in: input,options: [],range: NSRange(location: 0,length: input.count))
for match in matches {
print((input as Nsstring).substring(with: match.range))
}
}
在上面的代码中,我使用一个简单的空格作为分隔符 (#"t[^ ]+"#
) 并且输出符合预期:
this
the
test
但是,不仅应考虑空格,还应考虑所有单词边界。所以我用 \b
替换空格以匹配所有边界 (#"t[^\b]+"#
)。但是,这不起作用:
this is the
t test
似乎这段代码不是寻找词边界而是简单的b
...为什么会这样?
我认为在正则表达式之前和之后使用 #
会创建一个原始字符串,从而将 \
正确传递到正则表达式系统。所以 #"t[^\b]+"#
应该与 "t[^\\b]+"
相同并被翻译成 t[^\b]+
,不是吗?
还是 Swift 正则表达式中没有单词边界运算符 \b
?
编辑:
根据ICU Documentation \b
匹配词边界,因此[^\b]
(除词边界外的任何东西)不应与{{1 }}(除了ab之外的任何东西),应该吗?
不过,好像[^b]
不能用在set里吧?但是\b
也应该这样做(除了单词边界之外的任何东西)。
所以我尝试改用 \B
。但是,这根本找不到任何匹配项。
问题仍然存在:如何在 Swift NSRegularExpression 中匹配单词边界?
解决方法
#"t[^\b]+"#
字符串字面量产生一个 t[^\b]+
正则表达式,它只匹配 t
和一个或多个除 b
字符([^\b]
} 在 ICU 正则表达式中等于 [^b]
)。
要匹配一个 t
和一个或多个单词字符(即,直到下一个最左边的单词边界),您可以使用
pattern: #"t\w+"#
其中 \w+
将匹配一个或多个单词字符。
[...]
是一个字符集/类。字符类旨在匹配字符。 \b
是仅在字符类之外的词边界,因为词边界不是字符,它是匹配某个position 在字符串中。所有零宽度断言在字符类中都失去了它们特殊的“零宽度”含义。 [.$]
不表示 .
或字符串结尾,它匹配 .
或 $
字符。 [.\z]
不匹配 .
或字符串的最后,它匹配 .
或 z
因为 \
被省略,因为 \z
不是有效的转义序列。
此外,t\B+
也没有什么意义,因为 \B
也是一个零宽度断言,匹配字符串中的 location不是词边界位置。请注意,零宽度断言不会消耗文本,即没有文本添加到整个匹配内存缓冲区,并且正则表达式索引保持在尝试零宽度断言模式之前的位置。通过在 +
之后添加 \B
,您只需告诉正则表达式引擎在 t
之后匹配一个 location 不是单词边界,因此正则表达式引擎匹配 { {1}} 与 t\B+
相同,即它只匹配后跟字符字符(字母、数字、连接符标点)的 t\B
。
t
匹配(并且消耗)单词字符,因此如果您需要匹配(并真正得到结果)\w
之后直到第一个单词边界的任何字符,您只需要使用此 t
模式、\w
或 t\w*
(如果 t\w+
后必须至少有一个字符字符)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。