正则表达式:可以在正则表达式中进行子匹配吗?
Regex : Its possible to do submatching in regex?
我创建这个正则表达式来解析 mongodb url 如下:
/mongodb://((?'username'\w+):(?'password'\w+)@)?(?'hosts'\w[ \w]*)(/(?'defaultdb'[\w.]+))?(\?(?'options'.*$))?$/m
我在 regex101 中用它做了一些测试,我想知道是否可以解析主机组中的 ','(逗号)以生成一个数组,并在选项中类似地执行此操作用“&”分隔符分组。
我的意图是通过正则表达式结果进行迭代,并以一种方式将匹配组与您的结果一起使用,而无需按分隔符拆分。
预期示例:
mongodb://user:password@host,host2,host3,host4/databasename?options=1&options=2
组用户:user
群密码:password
群主机:主机
组主机:host2
组主机:host3
组主机:host4
组默认数据库:数据库名
组选项:选项=1
组选项:选项=2
一种可能的解决方法,使您的所有数据都按正确的顺序排列:
let str = 'mongodb://user:password@host,host2,host3,host4/databasename?options=1&options=2'
// substring(10) to avoid 'mongodb://'
console.log(str.substring(10).split(/[:@,/&?]/))
编辑:我在你编辑之前看到你在 Node 上,所以另一个解决方案是:
let str = 'mongodb://user:password@host,host2,host3,host4/databasename?options=1&options=2'
let regex = /mongodb:\/\/(?<username>\w+):(?<password>\w+)@(?<hosts>[,\w]*)\/(?<defaultdb>[\w\.]+)?\?(?<options>.*$)?$/
function splitGroup(group, items)
{
items.forEach(function (item, index) {
res.groups[group+'_'+index] = item
});
}
res = regex.exec(str)
res.groups.hosts = res.groups.hosts.split(',')
res.groups.options = res.groups.options.split('&')
splitGroup('host', res.groups.hosts)
splitGroup('option', res.groups.options)
delete res.groups.hosts
delete res.groups.options
console.log(Object.keys(res.groups).filter(v => v.startsWith('host')))
// [ 'host_0', 'host_1', 'host_2', 'host_3' ]
console.log(Object.keys(res.groups).filter(v => v.startsWith('option')))
// [ 'option_0', 'option_1' ]
我创建这个正则表达式来解析 mongodb url 如下:
/mongodb://((?'username'\w+):(?'password'\w+)@)?(?'hosts'\w[ \w]*)(/(?'defaultdb'[\w.]+))?(\?(?'options'.*$))?$/m
我在 regex101 中用它做了一些测试,我想知道是否可以解析主机组中的 ','(逗号)以生成一个数组,并在选项中类似地执行此操作用“&”分隔符分组。
我的意图是通过正则表达式结果进行迭代,并以一种方式将匹配组与您的结果一起使用,而无需按分隔符拆分。
预期示例:
mongodb://user:password@host,host2,host3,host4/databasename?options=1&options=2
组用户:user
群密码:password
群主机:主机
组主机:host2
组主机:host3
组主机:host4
组默认数据库:数据库名
组选项:选项=1
组选项:选项=2
一种可能的解决方法,使您的所有数据都按正确的顺序排列:
let str = 'mongodb://user:password@host,host2,host3,host4/databasename?options=1&options=2'
// substring(10) to avoid 'mongodb://'
console.log(str.substring(10).split(/[:@,/&?]/))
编辑:我在你编辑之前看到你在 Node 上,所以另一个解决方案是:
let str = 'mongodb://user:password@host,host2,host3,host4/databasename?options=1&options=2'
let regex = /mongodb:\/\/(?<username>\w+):(?<password>\w+)@(?<hosts>[,\w]*)\/(?<defaultdb>[\w\.]+)?\?(?<options>.*$)?$/
function splitGroup(group, items)
{
items.forEach(function (item, index) {
res.groups[group+'_'+index] = item
});
}
res = regex.exec(str)
res.groups.hosts = res.groups.hosts.split(',')
res.groups.options = res.groups.options.split('&')
splitGroup('host', res.groups.hosts)
splitGroup('option', res.groups.options)
delete res.groups.hosts
delete res.groups.options
console.log(Object.keys(res.groups).filter(v => v.startsWith('host')))
// [ 'host_0', 'host_1', 'host_2', 'host_3' ]
console.log(Object.keys(res.groups).filter(v => v.startsWith('option')))
// [ 'option_0', 'option_1' ]