Я знаю, что существует миллиард вопросов о регулярных выражениях в стеке, но я не могу понять, почему мой сопоставитель uri не работает в узле.
У меня есть следующее:
var uri = "file:tmp.db?mode=ro"
function parseuri2db(uri){
var regex = new RegExp("(?:file:)(.*)(?:\\?.*)");
let dbname = uri.match(regex)
return dbname
}
Я пытаюсь определить только имя базы данных, которое, как я ожидаю, будет:
- После незафиксированной
file:
группы - Перед завершением необязательных параметров
?
+строки
Пока я использую:
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' ]
, который, кажется, захватывает всю строку в первом аргументе, а не только одну группу захвата, которую я просил.
Мои вопросы:
- Что я делаю неправильно, что получаю несколько захватов?
- Как мне перефразировать это, чтобы захватить мои группы захвата с именами?
Я ожидал что-то вроде следующего для работы (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:)([^?]*)(?:\\??.*)"