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/6124824index
是一个你应该研究的函数。
看起来您希望正则表达式与字符串不匹配。可以通过多种方式确保它不匹配。交换字符串“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 中的模式匹配以句点“.”结尾的主要内容,如果未能解决你的问题,请参考以下文章
求一个匹配 以指定字符开头,指定字符结尾,中间内容任意的正则表达式
如果模式以 ; 结尾,则 Java 正则表达式匹配字符串或者啥都没有[重复]