const arr = str.split('&').map(n => (
n = n.split('='),
n[1] = isNaN(n[1]) ? n[1] : Number(n[1]),
({
name: n[0].endsWith('[]')
? `${n[0].slice(0, -2)}${typeof n[1] === 'number' ? `_${n[1]}` : ''}`
: n[0],
value: n[1],
})
));
const arr = Array.from(
new URLSearchParams(str),
([ k, v ]) => ({
name: k.replace(/\[\]$/, ''),
value: Number.isNaN(+v) ? v : +v,
})
);
const arr = [...str.matchAll(/([^&]+)=([^&]*)/g)].map(([ , k, v ]) => ({
name: k.match(/(.*?)(\[\])?$/)[1],
value: /^-?\d+(\.\d+)?$/.test(v) ? parseFloat(v) : v,
}));
str.split(/(?<=\S)\s*(?=[А-ЯЁ])/).join(' ')
// или
str.replace(/(?<=\S)(?=[А-ЯЁ])/g, ' ')
// или
str.replace(/(\S)(?=[А-ЯЁ])/g, '$1 ')
// или
str.replace(/[А-ЯЁ]/g, (m, i) => i && str[~-i] !== ' ' ? ' ' + m : m)
while не совсем удобен
while
заменить на for
, переместить вызов exec
в условие продолжения цикла - получится одна строка вместо трёх, область видимости вне цикла не загажена не нужной там переменной, вроде бы неплохо:for (let m; m = re.exec(str);) {
console.log(m.groups);
}
exec
стоит по другой причине. Проблема в том, что если забыть флаг g
при определении регулярного выражения, то exec
будет при каждом вызове выдавать первое совпадение, т.е., цикл получится бесконечным. А вот с matchAll
такой ерунды не случится, без флага выдаст ошибку:for (const { groups } of str.matchAll(re)) {
console.log(groups);
}
$doc = new DOMDocument();
$doc->loadHTML($html);
$a = $doc->getElementsByTagName('a');
$result = array_map([ $doc, 'saveHTML' ], iterator_to_array($a));
$result = preg_split('/(?<=\/a>)(?=<a)/', $html);
// или
preg_match_all('/<a .*?>.*?<\/a>/', $html, $matches);
$result = $matches[0];
const lines = data.split('\n').map(n => n.replace(/X\S+/, 'hello, world!!'));