Regex: Возможно ли сделать подсовпадение в regex? - PullRequest
2 голосов
/ 24 апреля 2020

Я создаю это регулярное выражение для анализа URL-адреса mongodb следующим образом:

/ mongodb: // ((? 'Username' \ w +): (? 'Password' \ w +) @)? (? 'Hosts '\ w [, \ w] *) (/ (?' defaultdb '[\ w.] +))? (\? (?' options '. * $))? $ / m

I сделайте с ним несколько тестов в regex101 , и я хочу знать, возможно ли проанализировать ',' (запятые) в группе хостов, чтобы получить массив, и аналогичным образом сделать это в группе опций с '& 'separator.

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

Ожидаемый пример:

mongodb: // user:password@host, хост2, хост3, хост4 / имя базы данных? options = 1 & options = 2

пользователь группы: пользователь

пароль группы: пароль

группа хостов : хост

группа хостов: хост2

группа хостов: хост3

группа хостов: хост4

группа defaultdb: имя базы данных

параметры группы : параметры = 1

групповые параметры: параметры = 2

1 Ответ

0 голосов
/ 25 апреля 2020

Возможный способ обойти все ваши данные в правильном порядке:

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' ]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...