Как я могу выйти из литеральной строки, которую я хочу интерполировать в регулярное выражение?

Вы можете решить это с помощью специального CSS, установив атрибут display thead в none:

Пример:

div[id="testForm:first"] thead {
    display:none;
}

, если ваш JSF похож на этот:

<h:form id="testForm">
    <p:dataTable id="first">
        ...
    <p:/dataTable>
</h:form>
13
задан brian d foy 23 December 2009 в 01:28
поделиться

2 ответа

Используйте quotemeta или \Q...\E.

Рассмотрим следующую тестовую программу, которая соответствует $str as-is, с quotemeta и с \Q...... \E:

#! /usr/bin/perl

use warnings;
use strict;

my $str = "www.abc.com";

my @test = (
  "www.abc.com",
  "www/abc!com",
);

sub ismatch($) { $_[0] ? "MATCH" : "NO MATCH" }

my @match = (
  [ as_is => sub { ismatch /$str/ } ],
  [ qmeta => sub { my $qm = quotemeta $str; ismatch /$qm/ } ],
  [ qe    => sub { ismatch /\Q$str\E/ } ],
);

for (@test) {
  print "\$_ = '$_':\n";

  foreach my $method (@match) {
    my($name,$match) = @$method;

    print "  - $name: ", $match->(), "\n";
  }
}

Заметьте в выводе, что использование строки as-is может привести к ложным совпадениям:

$ ./try
$_ = 'www.abc.com':
  - as_is: MATCH
  - qmeta: MATCH
  - qe: MATCH
$_ = 'www/abc!com':
  - as_is: MATCH
  - qmeta: NO MATCH
  - qe: NO MATCH

Для программ, которые принимают ненадежные входные данные, будьте предельно осторожны с использованием таких потенциально неприятных битов, как регулярные выражения: это может привести к неожиданным ошибкам во время выполнения, к уязвимостям в отказе в обслуживании и к дырам в безопасности.

.
32
ответ дан 1 December 2019 в 17:59
поделиться

Лучший способ сделать это - использовать \Q для начала строки, заключенной в кавычки, и \E для ее окончания.

my $foo = 'www.abc.com';
$bar =~ /blah\Q$foo\Eblah/;

Вы также можете использовать quotemeta для переменной сначала. Например,

my $quoted_foo = quotemeta($foo);

трюк \Q документирован в perlre в разделе "Escape Sequences."

.
12
ответ дан 1 December 2019 в 17:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: