我正在尝试查找并提取从文本文件中读取的单词在文本文件中的出现情况。到目前为止,我只能找到这个词何时被正确书写且未被修改(a 更改为 @ 或 i 更改为 1)。是否可以在我的字符串中添加正则表达式以进行匹配或类似的操作?到目前为止,这是我的代码:
sub getOccurrenceOfStringInFileCaseInsensitive
{
my $fileName = $_[0];
my $stringToCount = $_[1];
my $numberOfOccurrences = 0;
my @wordArray = wordsInFileToArray ($fileName);
foreach (@wordArray)
{
my $numberOfNewOccurrences = () = (m/$stringToCount/gi);
$numberOfOccurrences += $numberOfNewOccurrences;
}
return $numberOfOccurrences;
}
该例程接收文件名和要搜索的字符串。例程 WordsInFileToArray () 只是从文件中获取每个单词并返回一个包含它们的数组。
理想情况下,我希望直接从文件中一次性执行此搜索,而不是将所有内容移至数组并迭代它。但主要问题是如何将某些内容硬编码到函数中,以允许我捕获被修改的单词。
示例:我想从文件中提取这两行。
示例.txt:
russ1@anh@ck3r
俄罗斯黑客
# this variable also will be read from a blacklist file
$searchString = "russianhacker";
getOccurrenceOfStringInFileCaseInsensitive ("example.txt", $searchString);
预先感谢您的任何回复。
Edit:
可能的替换将由用户定义,并且必须将正则表达式设置为适合。用户可能会说常见的替换是将字母“a”更改为“@”甚至“1”。可能的改变是完全任意的。
当搜索特定单词(例如“Russian”)时,可以通过以下方式完成:
(m/russian/i); # would just match the word as it is
(m/russi[a@1]n/i); # would match the munged word
但如果我将要匹配的字符串存储在变量中,我不确定该怎么做,例如:
$stringToSearch = "russian";
这是一种全文搜索问题,因此一种方法是在匹配文档字符串之前对其进行规范化。
use strict;
use warnings;
use Data::Munge 'list2re';
...
my %norms = (
'@' => 'a',
'1' => 'i',
...
);
my $re = list2re keys %norms;
s/($re)/$norms{$1}/ge for @wordArray;
这种方法仅在任何给定单词只有一个可能的“规范化形式”时才有效,并且如果您的文档足够大并且每次搜索时都重新计算,那么效率可能比尝试搜索字符串的每个可能变体要低。 。
作为注释你的正则表达式m/$randomString/gi
应该m/\Q$randomString/gi
,因为您不希望 $randomString 中的任何正则表达式元字符以这种方式解释。请参阅文档引用元 https://perldoc.pl/functions/quotemeta.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)