我知道stackoverflow上有10亿个正则表达式问题,但我不明白为什么我的uri匹配器不能在node中工作。
我有以下几点:
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' ]
这似乎是在第一个参数中捕获整个字符串,而不仅仅是我要求的单个捕获组。
我的问题是:
-
我有什么错,我得到了多个捕获?
-
我该如何重新措辞,以使用名称捕获我的捕获组?
I expected
类似以下内容的工作(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:)([^?]*)(?:\\??.*)"