检查字符串是否以给定字符串开头

时间:2013-08-05 04:12:40

标签: perl

我正在尝试检查“5:16:51:209 | INFO |”之后的消息是否以“Marker”开头。我需要在timstamp之后添加字符串“| ICD”。

输入是:“05:16:51:209 | INFO | Markerprocedure Magnet”

我试过这个正则表达式,但它没有用。请帮我把它搞定。

if ( $lines[$i] =~ m/(\d{2}:\d{2}:\d{2}:\d{3})|(\w+)|^Marker/)
{

  $lines[$i] =~ s/(\d{2}:\d{2}:\d{2}:\d{3})(.*)/$1|ICD$2/ ;

}

1 个答案:

答案 0 :(得分:2)

I am trying to check if message after "5:16:51:209|INFO| " starts with "Marker"

我试图检查的是Marker 是否紧跟 5:16:51:209|INFO|,因此使用^正则表达式是不正确的字符,因为它检查字符串的开头是否发生在该位置(当然,它没有)。因此,删除^字符,Perl将检查紧随其后的Marker

此外,您需要转义|这样的字符:\|,以防止它被视为正则表达式中的交替命令。然后你可以在一个替换命令中进行测试和替换:

if ( $lines[$i] =~ s/(\d{2}:\d{2}:\d{2}:\d{3})(\|\w+\|Marker)/$1|ICD$2/ )
{
    # Line contained "Marker" and "|ICD" inserted
}

示例:

$ echo '15:16:51:209|INFO|Marker blah' | perl -ple 's/(\d{2}:\d{2}:\d{2}:\d{3})(\|\w+\|Marker)/$1|ICD$2/'

输出是:

15:16:51:209|ICD|INFO|Marker blah

编辑:@Prix在评论中指出,如果时间戳打算出现在字符串的开头,那么^开始标记应该在开头正则表达式,以防止字符串的其他部分(和性能)意外匹配:

 s/^(\d{2}:\d{2}:\d{2}:\d{3})(\|\w+\|Marker)/$1|ICD$2/
   ↑
   Use ^ here to anchor the search to the beginning of the string.