Regex для соответствия конца строки и захвата части перед концом строки perl [duplicate]

На этот вопрос уже есть ответ:

Я пытаюсь сопоставить любую строку с регулярным выражением, оканчивающимся на /? и извлеките строку перед /?

Ниже мой код:

$input = "boringinterestingboring/?";
if($input =~ /(.*)\/?$/) {
    print "$1\n";
}
else {
    print "not matched";
}

Я пытаюсь захватить "boringinterestingboring" с помощью (.*), но это не так, вместо этого он захватывает целая строка.

Как мне получить только строку перед /?.

Пожалуйста, помогите.

0
задан 19.01.2019, 10:31

3 ответа

Использование позитивного взгляда. Утверждение (?=..) будет соответствовать /?, но не сделает его частью группы захвата, даже если оно вложено в другую группу.

$ echo "boringinterestingboring/?" | perl -ne ' ($x)=/(boringinterestingboring(?=\/\?))/ ; print $x '
boringinterestingboring
$

Отрицательный тест. Ниже ничего не печатает

$ echo "boringinterestingboring#?" | perl -ne ' ($x)=/(boringinterestingboring(?=\/\?))/ ; print $x '

$
0
ответ дан 07.04.2019, 14:34
  • 1
    Эта альфа кодирует не, влияют на курсор хотя? Я хочу это без любой прозрачности, если это возможно. I' m получение цвета через платформу и определенно don' t хотят альфа-цвет везде, но все еще хотят, чтобы он соответствовал всему остальному, если это изменяется. – user2872777 26.01.2019, 04:09

Чтобы сопоставить все до, но не включая, /?:

.*(?=/\?)

Если вы не уверены в возможности побега, вы можете использовать класс символов, чтобы выполнить побег за вас: [ 114]

.*(?=/[?])
0
ответ дан 07.04.2019, 14:34
  • 1
    я могу попросить объяснения так, чтобы я понял то, что Вы сделали? эта строка: $href = is_checkout() ? '#customer_details' : wc_get_checkout_url() . '#customer_details';, почему формат это тот путь? –  26.01.2019, 04:04

Это может показаться дубликатом, но как ответ на ваш вопрос,
Ваше регулярное выражение должно быть:

/(.*)\/\?$/

или

/(.*)(?=\/\?$)/

Пример: [ 119]

$input = "boringinterestingboring/?";
print "Use \$1: $1\n" if($input =~ /(.*)\/\?$/);
print "Use \$1: $1\n" if($input =~ /(.*)(?=\/\?$)/);
print "Use \[112]amp;: [112]amp;\n" if($input =~ /.*(?=\/\?$)/);

Вывод:

Use $1: boringinterestingboring
Use $1: boringinterestingboring
Use [113]amp;: boringinterestingboring

Различные пути, один и тот же пункт назначения. Но в любом случае, вам также следует сбежать ? или поместить его в [].

0
ответ дан 07.04.2019, 14:34
  • 1
    @JessicaMcKay Это - просто способ уплотнить код, поскольку это будет то же самое, чем: if( is_checkout() ) { $href = '#customer_details'; } else { $href = wc_get_checkout_url() . '#customer_details'; } †¦ – LoicTheAztec 26.01.2019, 04:20

Теги

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