Java计算字符串中单词出现的次数
我有一个大的文本文件正在读取,因此我需要找出几个单词出现的次数。例如,单词the
。我正在逐行执行此操作,每一行都是一个字符串。
我要确保我只算合法the
的-在the
中other
起不到作用。这意味着我知道我需要以某种方式使用正则表达式。到目前为止,我正在尝试的是:
numSpace += line.split("[^a-z]the[^a-z]").length;
我意识到正则表达式目前可能不正确,但我尝试过不这样做,而只是尝试查找单词的出现,the
并且我也得到了错误的数字。我给人的印象是,它将字符串分割成一个数组,并且该数组被分割了多少次,就是单词在字符串中的次数。任何想法,我将不胜感激。
更新:给出一些想法,我想出了这个:
numThe += line.split("[^a-zA-Z][Tt]he[^a-zA-Z]", -1).length - 1;
虽然仍然得到一些奇怪的数字。我能够获得准确的常规计数(没有正则表达式),现在我的问题是正则表达式。
回答:
使用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++;
以上是 Java计算字符串中单词出现的次数 的全部内容, 来源链接: utcz.com/qa/423392.html