Регулярное выражение для замены формулы Excel именем листа

Привет, я пытаюсь написать регулярное выражение, чтобы заменить вхождение имени ячейки в формулах Excel псевдонимом вместо имени листа. Я использую Js XLS для разбора Excel. бывший :

 +AA74/AVERAGE('b'!Z40:AA40)

Требуемый выход

 +a_AA74/AVERAGE(b_Z40:b_AA40)

текущий выход

 +a_AA74/AVERAGE(b_Z40:a_AA40)

где 'a' - текущий лист, на котором записаны формулы, а 'b' - имя другого листа. Я хочу добавить имя листа перед каждым именем ячейки. Но в формуле этого типа формула диапазона должна содержать имя листа начального диапазона.

Текущий код, который я использую

var re = new RegExp("A.","g");
res = res.replace(re, "a_");
var re = new RegExp("A!","g");
res = res.replace(re, "a_");
var re = new RegExp("'B'!","g");
res = res.replace(re, "b_");
var re = new RegExp("'B'.","g");
res = res.replace(re, "b_");
res = res.replace(/\s/g,"");
res = res.replace(/(^|[^_A-Z])([A-Z]+\d+)/g, "$1"+'a_'+"$2");

person axcl    schedule 25.10.2016    source источник
comment
Пожалуйста, проверьте jsfiddle.net/33bxwc2c и дайте мне знать, работает ли это для вас.   -  person Wiktor Stribiżew    schedule 25.10.2016
comment
спасибо, это то, что я ищу.   -  person axcl    schedule 26.10.2016


Ответы (1)


Вы можете использовать

var re = /^\+A!?|'b'!([A-Z]+\d+):([A-Z]+\d+)/g;
var s = "+AA74/AVERAGE('b'!Z40:AA40)";
var res = s.replace(re, function(m, g1, g2) {
  if (g1) {
  	return 'b_'+g1 + ":b_" + g2;
  } else return '+a_A';
});
console.log(res);

Регулярное выражение ^\+A!?|'b'!([A-Z]+\d+):([A-Z]+\d+) соответствует:

  • ^\+A!? - +A или +A! в начале строки
  • | - or
  • 'b'! - последовательность буквальных символов
  • ([A-Z]+\d+) - Группа 1 захватывает 1+ заглавных символов ASCII, за которыми следует 1+ цифр
  • : - двоеточие
  • ([A-Z]+\d+) - Группа 2 захватывает 1+ заглавных символов ASCII, за которыми следует 1+ цифр

При замене мы проверяем, совпала ли группа 1 (= участвовала в матче). Если да, мы добавляем b_ к захваченному содержимому, если нет, мы просто добавляем a_ к A.

person Wiktor Stribiżew    schedule 26.10.2016