gpt4 book ai didi

regex - 在匹配字符串之前在变量上包含正则表达式

转载 作者:行者123 更新时间:2023-12-02 09:10:40 24 4
gpt4 key购买 nike

我正在尝试查找并提取从文本文件中读取的单词在文本文件中的出现情况。到目前为止,我只能找到这个词何时被正确书写并且未被修改(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);

预先感谢您的任何回复。

编辑:

可能的替换将由用户定义,并且必须将正则表达式设置为适合。用户可能会说常见的替换是将字母“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 以这种方式解释。请参阅 quotemeta 的文档.

关于regex - 在匹配字符串之前在变量上包含正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52711166/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com