У меня есть файл конфигурации .ini, в котором пользователи могут указать шаблон файла либо с помощью регулярного выражения Perl, либо в виде шаблона подстановки Ant. Например, следующее запрещает пользователю создавать файл, который не разрешен в Windows:
[BAN Defined using Ant Globbing]
file = **/prn.*
ignorecase = true
[BAN Defined using Regular expressions]
match = /(aux|con|com[0-9]*|lpt[0-9]*|nul|clock$)\.?[a-z]$
ignorecase = true
Прямо сейчас мне нужно преобразовать glob в регулярное выражение, чтобы программно обработать его. У меня есть процедура, которая делает это, но она довольно запутанная. Я ищу один из следующих:
- Простой способ преобразования glob в регулярное выражение
- Методы сопоставления выражений глобуса, как вы можете использовать с регулярными выражениями.
Например:
if ($regex =~ /\/(aux|con|com[0-9]*|lpt[0-9]*|nul|clock$)\.?[a-z]$) {
if ($glob ?magic? /**/prn.*/) {
Я надеялся, что есть какой-нибудь волшебный Perl-способ сделать это. Итак, есть ли простой способ сделать это:
Кстати, вот моя подпрограмма, если кому интересно:
sub glob2regex {
my $glob = shift;
my $regex = undef;
my $previousAstrisk = undef;
foreach my $letter (split(//, $glob)) {
#
# ####Check if previous letter was astrisk
#
if ($previousAstrisk) {
if ($letter eq "*") { #Double astrisk
$regex .= ".*";
$previousAstrisk = undef;
next;
} else { #Single astrisk: Write prev match
$regex .= "[^/]*";
$previousAstrisk = undef;
}
}
#
# ####Quote all Regex characters w/ no meaning in glob
#
if ($letter =~ /[\{\}\.\+\(\)\[\]]/) {
$regex .= "\\$letter";
#
# ####Translate "?" to Regular expression equivelent
#
} elsif ($letter eq "?") {
$regex .= ".";
#
# ####Don't know how to handle astrisks until the next line
#
} elsif ($letter eq "*") {
$previousAstrisk = 1;
#
# ####Convert backslashes to forward slashes
#
} elsif ($letter eq '\\') {
$regex .= "/";
#
# ####Just a letter
#
} else {
$regex .= $letter;
}
}
#
# ####Handle if last letter was astrisk
#
if ($previousAstrisk) {
$regex .= "[^/]*";
}
#
# ####Globs are anchored to both beginning and ending
#
$regex = "^$regex\$";
return $regex;
}
@{[function]}
), которого не знают простые смертные и мы, второсортные программисты. Я виделText::Glob
, но он все равно не расширяет расширенные глобусы в стиле Ant. - person David W.   schedule 08.07.2011