Вы можете сделать
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)))
Вопрос в том, что это намного лучше, чем ваше решение.
Чтобы сопоставить все до, но не включая, /?
:
.*(?=/\?)
Если вы не уверены в возможности побега, вы можете использовать класс символов, чтобы выполнить побег за вас: [ 114]
.*(?=/[?])
Использование позитивного взгляда. Утверждение (?=..)
будет соответствовать /?
, но не сделает его частью группы захвата, даже если оно вложено в другую группу.
$ echo "boringinterestingboring/?" | perl -ne ' ($x)=/(boringinterestingboring(?=\/\?))/ ; print $x '
boringinterestingboring
$
Отрицательный тест. Ниже ничего не печатает
$ echo "boringinterestingboring#?" | perl -ne ' ($x)=/(boringinterestingboring(?=\/\?))/ ; print $x '
$
Это может показаться дубликатом, но как ответ на ваш вопрос,
Ваше регулярное выражение должно быть:
/(.*)\/\?$/
или
/(.*)(?=\/\?$)/
Пример: [ 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
Различные пути, один и тот же пункт назначения. Но в любом случае, вам также следует сбежать ?
или поместить его в []
.