如何在 Kotlin 中使用正则表达式查找整个单词

5

我想在字符串中找到完整的单词。但我不知道如何在Kotlin中查找所有单词。我要查找的单词是[非字母]cba[非字母]。以下是我的示例代码。

val testLink3 = """cba@cba cba"""
val word = "cba"
val matcher = "\\b[^a-zA-Z]*(?i)$word[^a-zA-Z]*\\b".toRegex()
val ret = matcher.find(testLink3)?.groupValues

但是我的源代码输出是"cba",我期望的值是字符串数组,例如"{cba, cba, cba}"。如何在Kotlin语言中找到这个值。


没有起作用...抱歉,您的代码返回了cba@。 - taehyung
主要问题是您的预期匹配以特定方式重叠。如果您的字符串是cba@@@cba cba,那么预期结果将是什么?我可以“解决”这个问题,使用val matcher = "(?i)(?=(\\b[^A-Z]*$word[^a-zA-Z]*\\b))".toRegex()val ret = matcher.findAll(testLink3).map{it.groupValues[1].trim()}.toList().distinct()。但它可能会提取比您预期更多的内容。 - Wiktor Stribiżew
我想要计算“cba”单词的数量,并且不区分大小写。因此,我的期望值是字符串数组,例如[cba,Cba,cBa]。 - taehyung
类似于http://rextester.com/COSI60518这样的东西? - Wiktor Stribiżew
1
@WiktorStribiżew,谢谢,我已经解决了这个问题。 - taehyung
显示剩余5条评论
1个回答

8
您可以使用
val testLink3 = """cBa@Cba cbA123"""
val word = "cba"
val matcher = "(?i)(?<!\\p{L})$word(?!\\p{L})".toRegex()
println(matcher.findAll(testLink3).map{it.value}.toList() )
println(matcher.findAll(testLink3).count() )
// => [cBa, Cba, cbA]
// => 3

查看在线Kotlin演示

要获取匹配列表,您需要在正则表达式对象上运行findAll方法,将结果映射到值并强制转换为列表:

.findAll(testLink3).map{it.value}.toList()

要计算匹配项,您可以使用

matcher.findAll(testLink3).count()

正则表达式演示

  • (?i) - 不区分大小写的修饰符
  • (?<!\\p{L}) - 否定的向后查找,如果当前位置左边紧挨着一个字母,则匹配失败
  • $word - 你的 word 变量的值
  • (?!\\p{L}) - 否定的向前查找,如果当前位置右边紧挨着一个字母,则匹配失败

非常抱歉,但是您的代码是无效的答案。例如,如果源代码是 val testLink3 = """cba@cba cba123""",您的代码返回了2个对象。但是"cba123"也是一个单词。此外,您的答案也不正确。 - taehyung
如果你要搜索整个单词,需要使用\bword\b。如果你需要匹配包含word的任何单词,需要使用\b\w*word\w*\b。请确保你知道自己需要什么,然后明确问题。 - Wiktor Stribiżew
@dongwooktaehyung,你需要匹配什么?包含你的“word”值的单词吗? - Wiktor Stribiżew
我在顶部清晰地说过:除了字母以外,单词由所有其他字符分隔。 - taehyung
在以下情况下,它也是三个单词。"""Cba@cBa cbA123""". 但是您的代码只返回了2个单词。[Cba,cBa]。 - taehyung

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接