如何匹配管道字符后跟空格和另一个管道?

时间:2008-10-08 13:07:17

标签: regex perl

我正在尝试查找以| |开头的字符串中的所有匹配项。

我尝试过:if ($line =~ m/^\\\|\s\\\|/)无效。

有什么想法吗?

5 个答案:

答案 0 :(得分:27)

你正在逃避管道一次太多,而是有效地逃避了反斜杠。

print "YES!" if ($line =~ m/^\|\s\|/);

答案 1 :(得分:5)

管道角色应该在Perl正则表达式中使用单个反斜杠进行转义。 (Perl正则表达式与POSIX正则表达式略有不同。如果你在grep中使用它,那么事情会有所不同。)如果你专门寻找它们之间的空格,那么使用一个未转义的空格。它们在Perl正则表达式中完全可以接受。这是一个简短的测试程序:

my @lines = <DATA>;

for (@lines) {
    print if /^\| \|/;
}

__DATA__  
| | Good - space  
|| Bad - no space  
|   | Bad - tab  
 | | Bad - beginning space  
        Bad - no bars  

答案 2 :(得分:3)

如果它是您正在搜索的文字字符串,则不需要正则表达式。

my $search_for = '| |';
my $search_in = whatever();
if ( substr( $search_in, 0, length $search_for ) eq $search_for ) {
    print "found '$search_for' at start of string.\n";
}

或者可能更清楚:

my $search_for = '| |';
my $search_in = whatever();
if ( 0 == index( $search_in, $search_for ) ) {
    print "found '$search_for' at start of string.\n";
}

如果要在正则表达式中使用文字,可能还需要查看quotemeta

答案 3 :(得分:0)

删除^和双反斜杠。 ^强制字符串位于字符串的开头。由于您在一个字符串中查找所有匹配项,这可能不是您想要的。

m/\|\s\|/

答案 4 :(得分:-1)

怎么样:

m/^\|\s*\|/