Perl - 如果字符串包含文本?

Posted

技术标签:

【中文标题】Perl - 如果字符串包含文本?【英文标题】:Perl - If string contains text? 【发布时间】:2011-10-24 02:26:20 【问题描述】:

我想使用 curl 查看页面的来源,如果该来源包含与字符串匹配的单词,那么它将执行打印。我该怎么做if $string contains

在 VB 中是这样的。

dim string1 as string = "1"
If string1.contains("1") Then
Code here...
End If

类似的东西,但在 Perl 中。

【问题讨论】:

你想用这段代码做什么?当然,您知道不要使用正则表达式解析 URL(甚至不会使用著名的链接)。您可能会尝试使用诸如 WWW::MechanizeLWP::UserAgent 之类的引擎来获取页面,并使用诸如 html::TokeParser 之类的解析器来获取您所需要的信息。 【参考方案1】:

如果您只需要在另一个字符串中搜索一个字符串,请使用index 函数(如果您想从字符串末尾开始扫描,则使用rindex):

if (index($string, $substring) != -1) 
   print "'$string' contains '$substring'\n";

要在字符串中搜索pattern 匹配项,请使用匹配运算符m//

if ($string =~ m/pattern/)   # the initial m is optional if "/" is the delimiter
    print "'$string' matches the pattern\n";       

【讨论】:

只是一个子字符串,你应该使用index,它比正则表达式快4倍左右。【参考方案2】:

对于不区分大小写的字符串搜索,将index(或rindex)与fc结合使用。这个例子扩展了 Eugene Yarmash 的答案:

use feature qw( fc ); 
my $str = "Abc"; 
my $substr = "aB"; 

print "found" if index( fc $str, fc $substr ) != -1;
# Prints: found

print "found" if rindex( fc $str, fc $substr ) != -1;
# Prints: found

$str = "Abc";
$substr = "bA";

print "found" if index( fc $str, fc $substr ) != -1;
# Prints nothing

print "found" if rindex( fc $str, fc $substr ) != -1;
# Prints nothing

如果未找到子字符串,indexrindex 都会返回 -1。 并且fc 返回其字符串参数的大小写版本,应该在这里使用而不是(更熟悉的)uclc。请记住启用此功能,例如使用use feature qw( fc );

详情:

来自fc 文档:

大小写折叠是将字符串映射到消除大小写差异的形式的过程;比较两个字符串的大小写形式实际上是一种询问两个字符串是否相等的方法,而不管大小写。

来自Unicode FAQ:

问:案例映射和案例折叠有什么区别?

答:案例映射或案例转换是一个过程,其中字符串是 转换为特定形式——大写、小写或 标题大写——可能是为了显示给用户。案例折叠主要是 用于文本的无大小写比较,例如 a 中的标识符 计算机程序,而不是实际的文本转换。外壳折叠 在 Unicode 中主要基于小写映射,但包括 对源文本进行额外的更改以帮助实现它 语言不敏感和一致。结果,大小写折叠的文本 应仅用于内部处理,一般不应 存储或显示给最终用户。

【讨论】:

您能否澄清一下,什么是“字符串参数的大小写版本”? @mabalenk 这是为不区分大小写的字符串比较所做的操作。我在答案中添加了说明。【参考方案3】:
if ($string =~ m/something/) 
   # Do work

something 是一个正则表达式。

【讨论】:

但如果变量中有“某物”怎么办? @Eric m// 运算符插入变量。 如果您匹配的不是正则表达式,则不需要匹配运算符。对于纯文本字符串,index 函数可以正常工作。

以上是关于Perl - 如果字符串包含文本?的主要内容,如果未能解决你的问题,请参考以下文章

Perl - 如何从文本文件中省略行?

如何检查一个文件的值是不是包含在另一个文本文件中? (perl 脚本)

如何反转包含 Perl 中组合字符的字符串?

我必须在 Perl 预编译的正则表达式中转义哪些字符?

如何用逗号分割字符串而不在perl的引号内包含逗号?

从包含可变数据的文件中删除静态文本块