使用 perl 在字符串中搜索特定的子字符串模式

Posted

技术标签:

【中文标题】使用 perl 在字符串中搜索特定的子字符串模式【英文标题】:search a specific sub string pattern in a string using perl 【发布时间】:2017-03-07 05:11:19 【问题描述】:

我是 perl 的新手,我通过 Check whether a string contains a substring 了解如何检查字符串中是否存在子字符串,现在我的情况略有不同

我有一个类似

的字符串

/home/me/Desktop/MyWork/systemfile/directory/systemfile64.elf,

最后这可能是systemfile32.elfsystemfile16.elf,所以在我的perl 脚本中,我需要检查该字符串是否包含格式为systemfile*.elf 的子字符串。 如何在 perl 中实现这一点?

我打算这样做

if(index($mainstring, _serach_for_pattern_systemfile*.elf_ ) ~= -1) 
    say" Found the string";

【问题讨论】:

$string =~ /systemfile.*\.elf/ 你应该看看perldoc.perl.org/perlre.html 是的,解决了,谢谢 你能把它作为答案发布,以便我可以输入正确答案 你去,张贴 如果存在一个名为 64bitsystemfile.elfde 的文件怎么办?你仍然会得到 systemfile 和 .elf 的匹配项 【参考方案1】:

你可以使用模式匹配

if ($string =~ /systemfile\d\d\.elf$/)
   # DoSomething

\d 代表一个数字(0-9)

$ 代表字符串结束

【讨论】:

@HariprasadCR:索引函数在另一个字符串中搜索一个字符串,但没有完整正则表达式模式匹配的类似通配符的行为 @HariprasadCR 所以对我来说,如果你想使用index,听起来你必须做两次单独的检查【参考方案2】:

if( $mainstring =~ m'/systemfile(16|32)\.elf$' ) 
   say" Found the string";

完成这项工作。


供您参考:

$string =~ m' ... '

相同
$string =~ / ... /

根据给定的正则表达式检查字符串。这是 Perl 语言最有用的特性之一。

更多信息http://perldoc.perl.org/perlre.html

(我确实使用了 m'' 语法来提高可读性,因为在正则表达式中存在另一个 '/' 字符。我也可以写 /\/systemfile\d+\.elf$/

【讨论】:

我同意在匹配运算符上使用明确的m,以便您可以更改分隔符。但我认为单引号是一个糟糕的替代选择。它使正则表达式看起来像一个字符串。我可能会选择m[systemfile(16|32)\.elf$]【参考方案3】:
if ($string =~ /systemfile.*\.elf/) 
    # Do something with the string.

这应该只匹配您寻找的字符串(假设每次,给定的字符串都存储在$string 中)。在大括号内你应该写下你的逻辑。

. 代表“任何字符”,* 代表“看到最后一个字符的次数”。所以,.* 的意思是“你看到的任何字符”。如果您知道字符串将以这种模式结束,那么在模式的末尾添加$ 来标记字符串应该以这种模式结束会更安全:

$string =~ /systemfile.*\.elf$/

请不要忘记chomp $string 以避免任何可能干扰您所需输出的换行符。

【讨论】:

这也将匹配 *systemfile*.elf* OP 明确表示他想匹配 systemfile*.elf 因此我回答 if ($string =~ /^systemfile.*.\.elf$/); 我犯了同样的错误,假设他只想匹配没有路径的文件名。 :) 这也会匹配带有完整路径的字符串【参考方案4】:
use strict;
use warnings;

my $string = 'systemfile16.elf';
if ($string =~ /^systemfile.*\.elf$/) 
print "Found string $string";
   else 
print "String not found";

如果你有一个设置的目录,将匹配 systemfile'anythinghere'.elf。

如果你想搜索整个字符串,包括目录,那么:

my $string = 'c:\\windows\\system\\systemfile16.elf';
if ($string =~ /systemfile.*\.elf$/) 
print "Found string $string";
   else 
print "String not found";

如果您只想匹配 2 个系统文件,然后是 2 个数字字符 .elf,则使用上述其他答案中提到的其他方法。但如果你想要 systemanything.elf 然后使用其中之一。

【讨论】:

你应该转义最后一个点,因为它是字符点而不是占位符 @Jens。是的,我从未测试过代码。会更新它,尽管它会工作,不管它是错误的:) 所以不要逃避 .它也会接受 systemfile00.self 作为匹配项,这里我们只想完全匹配 .elf。感谢您发现它 实际上,“systemfile..”在字符串的末尾,所以你不希望^在开头(例如,你的示例字符串应该是'/home/me/Desktop/MyWork/systemfile/directory/systemfile09.elf') .此外,.* 将匹配任何内容,包括像 systemfile/not/the/right/one/.elf 这样的字符串......所以绝对不是 OP 想要的。 好的,我错过了他想要整个字符串的部分,所以我们应该删除 ^。但是他指定了“systemfile*.elf 格式的子字符串”,这意味着 systemfile“anythinghere”.elf 所以在我看来可能是 systemfile16.elf、systemfile32.elf 或 sytemfile64bit.elf。

以上是关于使用 perl 在字符串中搜索特定的子字符串模式的主要内容,如果未能解决你的问题,请参考以下文章

如何在当前文件夹和所有子文件夹中的所有文件中搜索特定文件内容[重复]

在一个用 JSON 填充的 NSArray 中搜索特定的标题

如何在子表单中搜索特定值以返回 VBA 结果

如何在 Oracle SQL 中搜索特定的 XML 值?

在 htop 中搜索特定的进程名称

在 gmail api 中搜索特定的 in-reply-to 标头