узел URI регулярное выражение не захватывает группы захвата - PullRequest
0 голосов
/ 01 мая 2019

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

У меня есть следующее:

var uri = "file:tmp.db?mode=ro"

function parseuri2db(uri){
    var regex = new RegExp("(?:file:)(.*)(?:\\?.*)");
    let dbname = uri.match(regex)
    return dbname
}

Я пытаюсь определить только имя базы данных, которое, как я ожидаю, будет:

  1. После незафиксированной file: группы
  2. Перед завершением необязательных параметров ? +строки

Пока я использую:

var regex1 = new RegExp("(?:file:)(.*)(?:\\?.*)");

Я думал, что ответ на самом деле был больше похож на:

var regex2 = new RegExp("(?:file:)(.*)(?:\\??.*)");

С 0 или 1 ?квантификатор по буквам \\?.Но последнее терпит неудачу.

В любом случае, мой результат:

console.log(parseuri2db(conf.db_in.filename))

[ 'file:tmp.db?mode=ro',
  'tmp.db',
  index: 0,
  input: 'file:tmp.db?mode=ro' ]

, который, кажется, захватывает всю строку в первом аргументе, а не только одну группу захвата, которую я просил.

Мои вопросы:

  1. Что я делаю неправильно, что получаю несколько захватов?
  2. Как мне перефразировать это, чтобы захватить мои группы захвата с именами?

Я ожидал что-то вроде следующего для работы (2):

function parseuri2db(uri){
  // var regex = new RegExp("(?:file:)(.*)(?:\\?.*)");
  // let dbname = uri.match(regex)
  var regex = new RegExp("(?<protocol>file:)(?<fname>.*)(<params>\\?.*)");
  let [, protocol, fname, params] = uri.match(regex)
  return dbname
  }
  console.log(parseuri2db(conf.db_in.filename))

Но:

  SyntaxError: Invalid regular expression: /(?<protocol>file:)(?<fname>.*)(<params>\?.*)/: Invalid group

Обновление1

Ответ на мой первый вопрос заключается в том, что мне нужно не фиксировать литерал ? во второй группе захвата:

"(?:file:)([^?]*)(?:\\??.*)"

1 Ответ

0 голосов
/ 27 мая 2019

Эта конкретная библиотека регулярных выражений узла не поддерживает группы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...