Я анализирую некоторые параметры в сценарии Perl, и мне трудно найти параметр, имеющий формат имени файла «name1.name2». Примером имени может быть "enroll.peacecorp" Мой код выглядит так:

my $parms = join(' ',@ARGV);
# other params here
$db_name  = $1  if ( $parms =~ /-dbname\s+(\w\.\w+)/ ); 
# more params here

Но вроде не работает. Я попытался установить шаблон на /-dbname\s+(\w.\w+)/, но и здесь безуспешно. Я также пробовал этот, который работал правильно, но не настолько гибок: /-dbname\s+(enroll.\w+)/

Я знаю, что для некоторых из вас, экспертов по регулярным выражениям, это не сложная проблема. Буду признателен за некоторые предложения. Спасибо.

1
BentChainRing 6 Сен 2016 в 09:45

3 ответа

Лучший ответ

Просто измените свое регулярное выражение с (\w\.\w+) на (\w+\.\w+)

2
John Doe 6 Сен 2016 в 06:51

Просто \ w подразумевает один символ.

Вы должны добавить к этому параметры ...

? = 0 or 1 of preceeding char.
* = 0 or MORE of preceding char.
+ = 1 or MORE of preceding char.

(?:([-]dbname)\s*)(\w+\.\w+)

Вместо строки «-dbname something.cool» он вернет только «something.cool».

Добавление ссылки Regex101, чтобы вы могли видеть разбивку вашего регулярного выражения.

Пример регулярного выражения

Обновить

Заметил назначение аргументов сценария. Мои извенения. Регулярное выражение обновлено. Он найдет аргумент, но будет фиксировать только значение имени ... сообщите мне, нужен ли вам также параметр -dbname или вам подходит только имя. Это регулярное выражение установлено как «соответствует», но не включает его.

0
Steve Kline 6 Сен 2016 в 07:00

У вас есть ошибка в регулярном выражении (отсутствует +). Вы можете рассмотреть возможность использования одного из Getopt modules или даже встроенный переключатель -s (см. perldoc perlrun) для анализа ваших аргументов. Для решения вашей непосредственной проблемы вы можете легко взять захваченные выражения из регулярного выражения следующим образом:

my ($db_name) = $parms =~ /-dbname\s+(\w+\.\w+)/;

В качестве альтернативы, вместо того, чтобы объединять @ARGV в строку и запускать для нее регулярное выражение, просто выполните итерацию по списку и возьмите аргумент после аргумента -dbname:

my $db_name;
for (my $i = 0; $i < @ARGV; $i++) {
  if ($ARGV[$i] eq '-dbname') {
    $db_name = $ARGV[++$i];
  }
}

die "usage: $0 -dbname foo.bar\n"
  unless $db_name;
3
mwp 12 Июн 2017 в 18:02