如果给定的字符串包含给定的子字符串,那么惯用的 scala 查找方式是啥?

Posted

技术标签:

【中文标题】如果给定的字符串包含给定的子字符串,那么惯用的 scala 查找方式是啥?【英文标题】:What is the idiomatic scala way of finding, if a given string contains a given substring?如果给定的字符串包含给定的子字符串,那么惯用的 scala 查找方式是什么? 【发布时间】:2012-04-24 23:19:38 【问题描述】:

我在 scala 中有两个字符串,我想知道较大的字符串 (needle) 是否包含较小的字符串 (haystack)。

我发现使用正则表达式和这样的匹配 (from this question):

needle.r.pattern.matcher(haystack).matches

对于这样一个简单的问题,(1)过于复杂,但更重要的是,(2)对我不起作用,因为

"needle".r.pattern.matcher("Finding needle in haystack").matches

返回

Boolean = false

【问题讨论】:

我可能遗漏了一些东西,但是 contains 有什么问题? 我正要问同样的问题 没什么问题,只是没找到:)仅此而已。 【参考方案1】:

如果您想以最高效率执行此操作,则可能必须自己编写(或在某处找到一个好的子字符串搜索算法)。如果你只是想让它工作,那么在 Scala 中:

scala> "Finding needle in haystack" contains "needle"
res0: Boolean = true

scala> "Finding needle in haystack" indexOf "needle"
res1: Int = 8

这些是不是正则表达式搜索。您也没有正确使用正则表达式匹配(编辑:因为该代码要求与整个字符串完全匹配,而不是找到匹配的子字符串),但这是一个不同的问题。如果你想计算匹配的数量,你可以这样做

scala> "needle".r.findAllIn("Finding needle in haystack").length
res2: Int = 1

【讨论】:

如果有人想知道,containsindexOf 只是 java.lang.String 上的方法,这里没有 Scala 魔法。我没有查看源代码,但我希望它们是经过优化的方法。 还有什么地方这么慢或者没有优化?【参考方案2】:

虽然回答了,但我想我也会提供这种正则表达式样式

scala> "I have a needle in my haystack" matches ".*needle.*"
res10: Boolean = true

【讨论】:

这很慢,只有在没有行终止符时才有效。 与其他答案相比。 indexOf()(其中 contains() 使用)在 Java 级别和 JVM 中都得到了很好的优化。 @EdStaub 这不是问题的主题,但如果需要正则表达式,这个答案仍然是相关的。 indexOf 和 contains 似乎不适用于正则表达式。

以上是关于如果给定的字符串包含给定的子字符串,那么惯用的 scala 查找方式是啥?的主要内容,如果未能解决你的问题,请参考以下文章

如何从给定的整个 NSString 计算相同的子字符串

如何知道给定字符串是不是是Java中另一个字符串的子字符串

2022-09-19:给定字符串 S and T,找出 S 中最短的(连续)子串 W ,使得 T 是 W 的 子序列 。 如果 S 中没有窗口可以包含 T 中的所有字符,返回空字符串 ““。 如果有不

hihoCoder 1039:字符消除(字符串处理)

OJ练习第66题——串联所有单词的子串

#yyds干货盘点# LeetCode面试题:串联所有单词的子串