【发布时间】:2021-08-20 18:30:08
【问题描述】:
我想在一个以某个前缀开头的字符串中捕获所有单词。例如所有以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]+,不是吗?
或者是单词边界运算符\b 在 Swift 正则表达式中不可用?
编辑:
根据ICU Documentation \b 匹配单词边界,因此[^\b](除单词边界外的任何内容)不应与[^b](除ab外的任何内容)相同,应该吗?
不过,\b 好像不能成套使用,可以吗?但是\B应该做同样的事情(除了单词边界之外的任何东西)。
所以我尝试改用#"t\B+"#。但是,这根本找不到任何匹配项。
问题依旧:如何在 Swift NSRegularExpression 中匹配单词边界?
【问题讨论】:
-
你的意思是你需要
pattern: #"t\w+"#? -
如果您将
t[^\b]+放入正则表达式在线工具中,它真的能显示您想要的吗?你的意思是\s而不是\b?或者\w+? -
不相关但不要在 Swift 中使用
NSString和NSRange(location:length:)。有(更可靠的)原生 API -
@WiktorStribiżew
#"t\w+"#与t123不匹配。我想匹配所有以 t 开头的单词,其中“单词”是由单词边界分隔的东西。 @Larme\b应根据 ICU 文档匹配单词边界,其中\s仅匹配空格。 -
\b匹配 - 检测 - 仅在字符类之外的单词边界。在其中,它在不同的正则表达式引擎/编程语言中表现不同。在 ICU 正则表达式中,[\b]匹配一个b而不是一个退格 (\x08) 字符,就像在许多其他正则表达式风格中一样,ICU 是一个非常特殊的正则表达式库,关于这种正则表达式风格还有很多奇怪的事情(例如裸 POSIX 字符类支持。)
标签: swift regex nsregularexpression