Учитывая следующую строку:
matrix(1.5, 0, 0, 2, 160, 160)
Я бы хотел заменить первые и четвертые значения - независимо от того, что они есть - с 1
, так что я бы:
matrix(1, 0, 0, 1, 160, 160)
Если первое и четвертое значения совпадают, я могу легко их заменить следующим образом:
.replace(/1\.5/g, "1")
Но это просто соответствует числу, а не позиции, поэтому оно не работает, если первое и четвертое значения не совпадают. Я хочу заменить любые значения на обеих этих позициях на 1
.
Вы можете использовать регулярное выражение:
.replace(/[\d.]+(?=(?:, [\d.]+){5}|(?:, [\d.]+){2}\))/g, "1")
Он будет в основном соответствовать цифре (с периодами, если таковые имеются), только если впереди еще 5 или более цифр до закрытия.
"How can I replace third value from the end and anywhere in the middle with five values in front?"
Возможно, ОП подразумевает это с примером строки. Но он отстаивал позиции слева направо.
этот шаблон [\d.]+((,[\s*\d.]+){2},\s*)[\d.]+
заменит первый и четвертый аргументы независимо от количества оставшихся аргументов. Замените демо 1$11
При чтении слева направо вы всегда можете отделить сегменты, которые хотите заменить. Не имеет значения, если его 1 или 99:
# (\(\s*)[^,]*((?:,[^,]*){2},\s*)[^,]*
# Replacement = $1 + '1' + $2 + '1'
( \( \s* ) # (1), Preamble
[^,]* # 1st value
( # (2), middle
(?: , [^,]* ){2}
, \s*
)
[^,]* # 4th value
Вот решение, которое не требует знания текущего типа аргумента:
.replace(/\(([^,]*),\s*([^,]*),\s*([^,]*),\s*([^,]*),\s*(.*?)\)/, "(1, $2, $3, 1, $5)");
Это работает путем сопоставления от начального парна до заключительного параграфа и записи каждого аргумента в отдельной группе захвата (за исключением того, что все остальные аргументы фиксируются в группе 5). Это немного больше, чем некоторые другие альтернативы, но это делает очень удобочитаемую замену.