Как мне сопоставить символ канала с пробелом и другим каналом? - PullRequest
8 голосов
/ 08 октября 2008

Я пытаюсь найти все совпадения в строке, которая начинается с | |.

Я пытался: if ($line =~ m/^\\\|\s\\\|/), который не работал.

Есть идеи?

Ответы [ 5 ]

27 голосов
/ 08 октября 2008

Вы избегаете трубы один раз слишком много, вместо этого фактически избегаете обратной косой черты.

print "YES!" if ($line =~ m/^\|\s\|/);
5 голосов
/ 08 октября 2008

Символ трубы должен быть экранирован одним обратным слешем в регулярном выражении 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  
3 голосов
/ 08 октября 2008

Если вы ищете буквальную строку, вам не нужно регулярное выражение.

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 , если хотите использовать литерал в регулярном выражении.

0 голосов
/ 07 апреля 2009

Снимите ^ и двойные косые черты. ^ Заставляет строку находиться в начале строки. Поскольку вы ищете все совпадения в одной строке, это, вероятно, не то, что вам нужно.

m/\|\s\|/
0 голосов
/ 08 октября 2008

А как же:

m/^\|\s*\|/ 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...