微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在 Swift NSRegularExpression 中捕获单词边界?

如何解决如何在 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 模式、\wt\w*(如果 t\w+ 后必须至少有一个字符字符)。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?