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

Вы можете сделать

let xs = ["1";"2"]
let ys = ["a";"b";"c"]
let zs = ["1";"2";"3";"4"]

let combinations =
    xs
    |> List.collect (fun x ->
        ys
        |> List.collect (fun y ->
            zs
            |> List.map (fun z -> x + y + z)))

Вопрос в том, что это намного лучше, чем ваше решение.

0
задан zubug55 18 January 2019 в 22:31
поделиться

3 ответа

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

.*(?=/\?)

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

.*(?=/[?])
0
ответ дан haukex 18 January 2019 в 22:31
поделиться

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

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

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

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

$
0
ответ дан stack0114106 18 January 2019 в 22:31
поделиться

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

/(.*)\/\?$/

или

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

Пример: [ 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
ответ дан Tiw 18 January 2019 в 22:31
поделиться
Другие вопросы по тегам:

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