Regex для замены частей строки на основе позиции

0

Учитывая следующую строку:

matrix(1.5, 0, 0, 2, 160, 160)

Я бы хотел заменить первые и четвертые значения - независимо от того, что они есть - с 1, так что я бы:

matrix(1, 0, 0, 1, 160, 160)

Если первое и четвертое значения совпадают, я могу легко их заменить следующим образом:

.replace(/1\.5/g, "1")

Но это просто соответствует числу, а не позиции, поэтому оно не работает, если первое и четвертое значения не совпадают. Я хочу заменить любые значения на обеих этих позициях на 1.

  • 0
    это я или вы изменили номер в следующем примере: /
  • 0
    Вы правы, я имел в виду первое и четвертое, а не первое и третье. Исправленный.
Теги:
string
position
replace

4 ответа

1
Лучший ответ

Вы можете использовать регулярное выражение:

.replace(/[\d.]+(?=(?:, [\d.]+){5}|(?:, [\d.]+){2}\))/g, "1")

regex101 demo

Он будет в основном соответствовать цифре (с периодами, если таковые имеются), только если впереди еще 5 или более цифр до закрытия.

  • 0
    Это решение вопроса "How can I replace third value from the end and anywhere in the middle with five values in front?" Возможно, ОП подразумевает это с примером строки. Но он отстаивал позиции слева направо.
  • 0
    Это работает отлично, спасибо!
Показать ещё 1 комментарий
1

этот шаблон [\d.]+((,[\s*\d.]+){2},\s*)[\d.]+ заменит первый и четвертый аргументы независимо от количества оставшихся аргументов. Замените демо 1$11

  • 0
    +1 Мне нравится этот ответ.
0

При чтении слева направо вы всегда можете отделить сегменты, которые хотите заменить. Не имеет значения, если его 1 или 99:

 #  (\(\s*)[^,]*((?:,[^,]*){2},\s*)[^,]*
 #  Replacement =  $1 + '1' + $2 + '1' 

 ( \( \s* )              # (1), Preamble
 [^,]*                   # 1st value
 (                       # (2), middle 

      (?: , [^,]* ){2}
      , \s* 
 )
 [^,]*                   # 4th value
0

Вот решение, которое не требует знания текущего типа аргумента:

.replace(/\(([^,]*),\s*([^,]*),\s*([^,]*),\s*([^,]*),\s*(.*?)\)/, "(1, $2, $3, 1, $5)");

Это работает путем сопоставления от начального парна до заключительного параграфа и записи каждого аргумента в отдельной группе захвата (за исключением того, что все остальные аргументы фиксируются в группе 5). Это немного больше, чем некоторые другие альтернативы, но это делает очень удобочитаемую замену.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню