Я хотел бы проанализировать строку с JavaScript .replace
, , за исключением , если она находится между несколькими парами разделителей. Какой способ сделать это является самым простым, и, надеюсь, наиболее общим и / или эффективным?
Я пытался чередовать параметры для левого и правого разделителей в своем регулярном выражении; использование аргумента обратного вызова в .replace
для поиска двух захваченных разделителей каждого соответствия в объекте карты; и отвечает соответственно, но это решение не работает полностью .
В этой конкретной ситуации я хочу заменить экземпляры ++
, за которыми сразу следует хотя бы один не плюс символ, за которым сразу следует ++
, только с вложенным текстом, заглавными буквами - за исключением случаев, когда между , но необязательно непосредственно предшествует / сопровождается @<
и >@
или @@
и @@
.
var options = {
'@<': ['>@', 5, 2],
'@@': ['@@', 2, 2]
},
possiblyParse = str => str.replace(/(@<|@@|^).+?(>@|@@|$)/g, (a, b, c) =>
options.hasOwnProperty(b) && options[b][0] == c ?
a.slice(options[b][1], a.length - options[b][2]) : // If string suitably enclosed, return it without delimiters
a.replace(/\+\+([^\+]+)\+\+/g, (a, b) => b.toUpperCase())); // Otherwise, do something, keeping delimiter(s) if any
console.log(possiblyParse('input'));
Этот код дает эти приемлемые результаты ...
console.log(possiblyParse('++abc++'))); // ABC
console.log(possiblyParse('@<++abc++>@')); // ++abc++
console.log(possiblyParse('@@++abc++@@')); // ++abc++
console.log(possiblyParse('@<++abc++@@')); // @<ABC@@
console.log(possiblyParse('@@++abc++>@')); // @@ABC>@
console.log(possiblyParse('@<++abc++')); // @<ABC
console.log(possiblyParse('++abc++@@')); // ABC@@
… и терпит неудачу здесь:
console.log(possiblyParse('z@<@++abc++>@')) // z@<ABC>@, should be z++abc++
console.log(possiblyParse('++abc++ @<@++abc++>@')) // ABC @<ABC>@, should be ABC ++abc++
Я подозреваю, что проблема с моим регулярным выражением, /(@<|@@|^).+?(>@|@@|$)/g
, которое, как мне кажется, соответствует @<
, @@
или началу ввода, затем лениво соответствует хотя бы одному символу, затем соответствует >@
, @@
или конец ввода. Можете ли вы помочь решить эту проблему?