栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Java计算字符串中单词出现的次数

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java计算字符串中单词出现的次数

使用

split
计数不是最有效的方法,但是如果您坚持要这样做,那么正确的方法是:

haystack.split(needle, -1).length -1

如果您未将设置

limit
-1
,则
split
默认为
0
,这将删除结尾的空字符串,这会弄乱您的计数。

从API中:

limit参数控制应用图案的次数,因此会影响所得数组的长度。[…]如果

n
为零,则将丢弃尾随的空字符串。

您还需要从

length
数组的中减去1 ,因为
N
出现定界符会将字符串分成多个
N+1
部分。


至于正则表达式本身(即

needle
),您可以
b
在周围使用单词boundary anchors
word
。如果允许
word
包含元字符(例如,计数
"$US"
),则可能需要
Pattern.quote


我想出了这个:

numThe += line.split("[^a-zA-Z][Tt]he[^a-zA-Z]", -1).length - 1;

虽然仍然得到一些奇怪的数字。我能够获得准确的常规计数(没有正则表达式),现在我的问题是正则表达式。

现在的问题是,您没有计算

[Tt]he
出现在第一个或最后一个单词上的内容,因为正则表达式说它必须在某个字符之前/之后跟一些匹配的字符
[^a-zA-Z]
(也就是说,您的匹配长度必须为5!
)。您不允许根本 没有 字符的情况!

您可以改用以下方法:

"(^|[^a-zA-Z])[Tt]he([^a-zA-Z]|$)"

这不是最简洁的解决方案,但可以。

这样的事情(使用否定的环顾四周)也可以:

"(?<![a-zA-Z])[Tt]he(?![^a-zA-Z])"

这样的好处是可以匹配 just

[Tt]he
,而无需像以前的解决方案那样在其周围包含任何额外的字符。如果您实际上要处理所返回的令牌
split
,则这是相关的,因为在这种情况下,定界符不会“窃取”令牌中的任何内容。


非-
split

尽管使用

split
count相当方便,但这并不是最有效的方法(例如,它正在做各种工作来返回您丢弃的那些字符串)。正如您所说,您是逐行计数的,这意味着该模式还必须重新编译并扔掉每一行。

一个更有效的方法是使用你之前做了同样的正则表达式和做平常

Pattern.compile
while (matcher.find())count++;



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/569375.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号