2016-05-02 2 views
-1

В моей текущей задаче я анимирую координаты SVG-путей, поэтому я пытаюсь программно изменить их значения в зависимости от смещения, которое пользователь меняет. Координаты в уродливых атрибутов, значения которых выглядит примерно так:Замените regex capture на значения из массива (javascript)

M0,383c63,0,89.3, -14.1,117.4, -65,9 ...

Для смещения 100, то новое значение, возможно, потребуется смотреть что-то вроде:

M0, c63,0,89.3, -14,1, 217,4, -65,9 ... // without the bold (it's just there to highlight diff)

я прохожу в различных регулярных выражений для разных путей, которые выглядят что-то например, /long(N)and...N...ugly(N)regex/, но каждый пат h имеет другое количество захватов (я могу пройти и в этом количестве). Используя answers here и цикл, я выяснил, как программно создавать массив вновь измененных значений (независимо от количества захватов), давая мне что-то вроде ['483','217.4',...].

Мой вопрос:, как программно заменить/вставить измененные числа обратно в строку (как в строке выше с выделенными цифрами)?


Мой обходной путь на данный момент ( and a fiddle):

Я генерируя «Reverse» регулярное выражение, переключаясь скобки вокруг, которая заканчивается глядя, как /(long)N(and...N...ugly)N(regex)/. Тогда я делаю вещи вручную, например .:

if (previouslyCapturedCount == 3) { 
    d = d.replace(reverseRE, "$1" + dValuesAltered[0] + "$2" + dValuesAltered[1] + "$3" + dValuesAltered[2] + "$4"); 
} else if (previouslyCapturedCount == 4) { 
    // and so on ... 

Но там должен быть лучше, нет? (Может быть, из-за мое отсутствие JS Skillz, я просто был не в состоянии экстраполировать из ответов на выше связанный вопросе.)


Оговорка: There are several questions here на С.О. которые, похоже, отвечают, как выполнять множественные замены на определенных парах, но они, похоже, принимают глобальные замены, и у меня есть , не гарантируя, что совпадающие/записанные числа будут уникальными в строке.

+1

Просьба указать [MVCE (минимальный полный проверяемый пример)] (http://stackoverflow.com/help/mcve). –

+1

@ WiktorStribiżew не MCVE intead? ;) –

+0

Шесть из одного, полдюжины других –

ответ

1

Вместо того, чтобы создавать огромный сложный шаблон, чтобы найти и заменить все, что вы ищете, я буду перебирать каждый элемент и заменять его по одному. С регулярным выражением, которое выглядит так:

В этом регулярном выражении {1} - это количество значений с разделителями-запятыми, которые вы хотели бы пропустить. В этом случае мы пропускаем первый и заменяем только ведущие числа во второй строке.

^(,?[^,]*){1},([0-9]+) 

Заменить следующим, где _XX_ есть искомое новое значение.

$1,_XX_ 
+0

Благословите, что вы ответили на мой нисходящий вопрос (и объясняли такие вещи, как {1}, которые я не видел в то время). Клянусь, я пытался работать над тем, чтобы получить что-то, основанное на твоем ответе, но даже после ночного отдыха это заставило мою голову не-программисту больно, ха-ха, и хотя это, вероятно, было бы лучшей отправной точкой, поскольку У меня уже были сумасшедшие регулярные выражения, это было больше усилий, чем просто с моим обходным решением. Возможно, я попробую еще раз после кофе. Еще раз спасибо! –

+0

Итак, что касается вас OP, вы говорите, что у вас есть смещение 100, а затем некоторые подвыборы в вашей строке. Каковы критерии для определения того, какие субварианты будут изменены? Кроме того, похоже, что вы, возможно, уже приземлились на решение, если это так, вы должны опубликовать свое решение в качестве ответа на свой вопрос. –

+0

Относительные значения, которые были изменены, являются довольно произвольными; Я должен вручную выяснить, какие из них нужно изменить после создания SVG (bleh). Мое «решение» проблемы реинъекции в OP - это всего лишь обходной путь (где я вручную выписываю 'if (captureCount == 3) {...' для каждого captureCount, а не нечто вроде однострочного) , Я предполагаю, что мой более общий/общий вопрос заключался в том, возможно ли, с учетом регулярного выражения, заменить программные изменения с измененными значениями. И я думал, что заставить этот массив получить меня на полпути (хотя, возможно, это был ненужный шаг). –