如果给定的字符串包含给定的子字符串,那么惯用的 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
【讨论】:
如果有人想知道,contains
和 indexOf
只是 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 查找方式是啥?的主要内容,如果未能解决你的问题,请参考以下文章
2022-09-19:给定字符串 S and T,找出 S 中最短的(连续)子串 W ,使得 T 是 W 的 子序列 。 如果 S 中没有窗口可以包含 T 中的所有字符,返回空字符串 ““。 如果有不