В настоящее время я хочу создать функцию, которая разбивает ссылку на ячейку таблицы таблиц в компонентах столбца/строки (буквы/числа).
Формула, с которой я сейчас работаю:
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, но я не понимаю, почему это работает не так, как ожидалось.
Все точки приветствуются, большое спасибо.
Вам нужно удалить глобальный модификатор 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
в позицию, где заканчивается совпадение, поэтому следующий матч будет искать из позиции, которая может быть уже пройдена после текста, где шаблон может совпадать.
Таким образом, оказывается, что небольшая корректировка моего кода заставила его работать.
Ввел оператор трубы в выражение регулярного выражения и заменил 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));
}
}
/(\$?[A-Za-z]+)|(\$?[0-9]+)/g
будет соответствовать нескольким вхождениям(\$?[A-Za-z]+)
или(\$?[0-9]+)
шаблоны в любом месте строки. Если в строке есть две группы, я бы предложил/^(\$?[A-Za-z]+)(\$?[0-9]+)$/
. Не найдено совпадений в$12()abc$A