PERL 中的模式匹配以句点“.”结尾

Posted

技术标签:

【中文标题】PERL 中的模式匹配以句点“.”结尾【英文标题】:Pattern matching in PERL ending with period "." 【发布时间】:2021-01-21 05:36:09 【问题描述】:

我正在做如下模式匹配。但我没有得到正确的输出。请建议正确的代码以获得正确的输出。

代码

#! /usr/bin/perl -w

my $subString = "1.3.6.1.2.1.26.2.1.1.1.";
my $wholeString = "1.3.6.1.2.1.26.2.1.1.12.1";

 if ($wholeString =~ m/^$subString/)

print "matched string is : $&\n";
print "Wrong!!!!\n";

else

print "matched string is : $&\n";
print "Right!!!!!\n";

实际输出: 匹配的字符串是:1.3.6.1.2.1.26.2.1.1.12 错了!!!!

预期输出: 匹配的字符串是:1.3.6.1.2.1.26.2.1.1.1。 对啊!!!!!!

我应该在代码中进行哪些更改以获得预期的输出?请

【问题讨论】:

@YVRAO - 见:***.com/a/7283308/6124824 index 是一个你应该研究的函数。 看起来您希望正则表达式与字符串不匹配。可以通过多种方式确保它不匹配。交换字符串“Wrong”和“Right”也是如此。您需要解释正则表达式失败的原因。因为整个字符串更长?因为整个字符串在最后一个“1”之后有一个数字?这些原因需要不同的正则表达式。下面的答案是在猜测你的意图,正确与否无关紧要,你的问题不清楚。 在正则表达式 '.'用于匹配除换行符以外的任何字符。 是的,泰德·林格莫。感谢您的回答和 cmets。 【参考方案1】:

点在正则表达式中具有特殊含义 - 表示“匹配此处的任何字符”。所以“.1”。在您的子字符串末尾很高兴匹配测试字符串中的“.12”。

要删除点(和所有其他特殊字符)的特殊含义,您可以使用\Q 转义序列。

if ($wholeString =~ m/^\Q$subString/)

但是(正如 cmets 中已经指出的那样),正则表达式匹配在这里可能不是正确的工具。您可能需要index() 函数。

if (index($wholeString, $subString) == 0)

【讨论】:

【参考方案2】:

. 匹配正则表达式中的任何字符,看起来您想检查 $wholeString 是否以 $subString 开头而没有正则表达式匹配。这可以使用substr

if(substr($wholeString, 0, length($subString)) eq $subString) 
    # $wholeString starts with $subString
 else 
    # $wholeString does not start with $subString

【讨论】:

以上是关于PERL 中的模式匹配以句点“.”结尾的主要内容,如果未能解决你的问题,请参考以下文章

求一个匹配 以指定字符开头,指定字符结尾,中间内容任意的正则表达式

Perl中的模式匹配和模式替换介绍

Perl中的多个模式的字符串匹配

如果模式以 ; 结尾,则 Java 正则表达式匹配字符串或者啥都没有[重复]

如何编写正则表达式模式以匹配字符串结尾或字符串开头的货币符号

perl学习模式匹配与正则表达式