Скрипт Google Apps (JavaScript) Разделение регулярных выражений Ссылки на ячейки электронной таблицы

1

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

Формула, с которой я сейчас работаю:

function reTest() {
  var re = /(\$?[A-Za-z]+)(\$?[0-9]+)/g;
  var cells = ['A1', 'AA1', 'A12', 'A$1', 'AA$1', 'A$12', '$A1', '$AA1', '$A12', '$A$1', '$AA$1', '$A$12'];
  for (var i = 0; i < cells.length; i++) {
    Logger.log(re.exec(cells[i]));
  }
}

Мой желаемый результат (хотя и усеченный) был бы следующим образом:

['A', '1']
['AA', '1']
['A', '12']
['A', '$1']
etc...

Однако в настоящее время мой результат:

[A1, A, 1]
null
[A12, A, 12]
null
[AA$1, AA, $1]
null
[$A1, $A, 1]
null
[$A12, $A, 12]
null
[$AA$1, $AA, $1]
null

Я буду откровенен и скажу, что я немного новичок в Regex, но я не понимаю, почему это работает не так, как ожидалось.

Все точки приветствуются, большое спасибо.

Теги:
google-apps-script

2 ответа

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

Вам нужно удалить глобальный модификатор g и захватить только группы 1 и 2 группы:

Этот код:

function reTest() {
  var re = /(\$?[A-Za-z]+)(\$?[0-9]+)/;
  var cells = ['A1', 'AA1', 'A12', 'A$1', 'AA$1', 'A$12', '$A1', '$AA1', '$A12', '$A$1', '$AA$1', '$A$12'];
  for (var i = 0; i < cells.length; i++) {
    var m = re.exec(cells[i]);
    if (m) {
      Logger.log([m[1], m[2]]);
    }
  }
}

Производит:

[17-08-04 18:27:18:994 CEST] [A, 1]
[17-08-04 18:27:18:995 CEST] [AA, 1]
[17-08-04 18:27:18:995 CEST] [A, 12]
[17-08-04 18:27:18:996 CEST] [A, $1]
[17-08-04 18:27:18:996 CEST] [AA, $1]
[17-08-04 18:27:18:997 CEST] [A, $12]
[17-08-04 18:27:18:998 CEST] [$A, 1]
[17-08-04 18:27:18:998 CEST] [$AA, 1]
[17-08-04 18:27:18:999 CEST] [$A, 12]
[17-08-04 18:27:18:999 CEST] [$A, $1]
[17-08-04 18:27:19:000 CEST] [$AA, $1]
[17-08-04 18:27:19:000 CEST] [$A, $12]

Или вы также можете указать движку регулярных выражений соответствовать всей строке, добавив якоря:

var re = /^(\$?[A-Za-z]+)(\$?[0-9]+)$/;

Зачем вам нужно удалить глобальный модификатор: при добавлении g свойство regex .lastIndex в позицию, где заканчивается совпадение, поэтому следующий матч будет искать из позиции, которая может быть уже пройдена после текста, где шаблон может совпадать.

  • 0
    Отлично! Я также нашел решение для этого, так же, как вы опубликовали это, которое я разместил выше, есть ли причина выбирать один путь перед другим?
  • 0
    /(\$?[A-Za-z]+)|(\$?[0-9]+)/g будет соответствовать нескольким вхождениям (\$?[A-Za-z]+) или (\$?[0-9]+) шаблоны в любом месте строки. Если в строке есть две группы, я бы предложил /^(\$?[A-Za-z]+)(\$?[0-9]+)$/ . Не найдено совпадений в $12()abc$A
Показать ещё 1 комментарий
1

Таким образом, оказывается, что небольшая корректировка моего кода заставила его работать.

Ввел оператор трубы в выражение регулярного выражения и заменил RegExp.exec на string.match.

function reTest() {
  var re = /(\$?[A-Za-z]+)|(\$?[0-9]+)/g;
  var cells = ['A1', 'AA1', 'A12', 'A$1', 'AA$1', 'A$12', '$A1', '$AA1', '$A12', '$A$1', '$AA$1', '$A$12'];
  for (var i = 0; i < cells.length; i++) {
    Logger.log(cells[i].match(re));
  }
}

Ещё вопросы

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