【问题标题】:Pattern matching in PERL ending with period "."PERL 中的模式匹配以句点“.”结尾
【发布时间】: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。 对啊!!!!!!

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

【问题讨论】:

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

标签: perl


【解决方案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
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-02
      • 2022-07-21
      • 1970-01-01
      • 1970-01-01
      • 2022-01-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多