Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 检查字符串是否以给定字符串开头_Perl - Fatal编程技术网

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

Perl 检查字符串是否以给定字符串开头,perl,Perl,我试图检查“5:16:51:209 | INFO |”之后的消息是否以“Marker”开头。我需要在timstamp后面添加字符串“| ICD” 输入为:“05:16:51:209 |信息|标记程序磁铁” 我试过这个正则表达式,但它不起作用。请帮我把它弄对 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$

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

输入为:“05:16:51:209 |信息|标记程序磁铁”

我试过这个正则表达式,但它不起作用。请帮我把它弄对

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/ ;

}
在我看来,您试图检查的是
标记是否紧跟在
5:16:51:209 | INFO |
之后,因此使用
^
正则表达式字符是不正确的,因为它会检查字符串的开头是否出现在该位置(当然,它不会出现)。因此,删除
^
字符,Perl将检查
标记是否紧跟其后

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

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
Edit:@Prix在评论中指出,如果时间戳要出现在字符串的开头,那么
^
开始标记应该出现在正则表达式的开头,以防止字符串的其他部分意外匹配(以及性能):


实际上,使用<代码> ^ < /代码>是正确的。然而,他在错误的地方使用它,应该在开始<代码> /^ < /代码>,因为他可能不想找到其他类似于在字符串中间的时间戳的其他东西。应该没有
^
。但我同意,在实践中,匹配很可能只发生在字符串的开头,因此我将编辑我的答案。是的,这是正确的,但我基于他提供的样本输入,该样本输入以时间戳开头,希望OP将其清除。同样根据他的示例字符串,在初始数字之前也有一个空格。如果字符串的开头有空格,那么我将把它留给OP来决定应该对正则表达式做什么来解释它。因为这是一个与问题的主要目的无关的次要问题,所以我觉得回答得如此详细就太难了。
15:16:51:209|ICD|INFO|Marker blah
 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.