Регулярное выражение в скрипте Google - PullRequest
0 голосов
/ 09 сентября 2018

У меня есть 2 регулярных выражения, которые отлично работают на regex101, но в скрипте листа одно ( REGEX_RANGO ) возвращает false при вызове .test, а другое ( REGEX_INVIDIDUAL ) не работает вообще.

(Примечание: я использую ячейку на листе для отладки подобной ситуации, я не знаю, лучше ли это, если кто-то знает, пожалуйста, опубликуйте ее!)

Мои текущие регулярные выражения:

var REGEX_RANGO = /((?=(\d|\,))(\d{1,3}-\d{1,3})+(?=(\s|\,)))/gm;
var REGEX_INDIVIDUAL = /((?<=,)|(?:^(\d)))[^(,|\-)\n]+((?=,)|(?:\s))/gm;

Зачем мне оба? У меня есть форма, к которой люди могут присоединяться к значениям, и с ними могут работать регулярные выражения.

Входные данные имеют вид:

  • *000-005,100,200,250-275,300*:
    • REGEX_RANGO должен получить в массиве значения [000,005,250,275]
    • REGEX_INDIVIDUAL в другом массиве должно получить [100,200,300]
  • *001,002,003,010-015*:
    • REGEX_RANGO должен получить в массиве значения [010,015]
    • REGEX_INDIVIDUAL должно получить [001,002,003]

Надеюсь, кто-то знает, как с этим справиться, спасибо. Вы можете найти мои текущие попытки здесь и здесь .

Чтобы быть ясным: это работает нормально на regex101, а не в Google Sheet, может быть, область или мне нужно отменить регулярное выражение?

РЕДАКТИРОВАНИЕ:

var REGEX_INDIVIDUAL = /((?<=,)|(?:^(\d)))[^(,|\-)]+(?=($|,))/gm;
var j = numeros_ingresados.match( REGEX_INDIVIDUAL )
SpreadsheetApp.getActiveSheet( ).getRange("F1").setValue( " >> j : " + j )

1 Ответ

0 голосов
/ 09 сентября 2018

Обратите внимание, что GAS JS RegExp не поддерживает в вашем шаблоне внешний вид, похожий на (?<=,).

Вы можете использовать следующий пример кода для извлечения необходимых значений:

function extractRangos() {
  var s = "000-005,100,200,250-275,300";
  var REGEX_RANGO = /(?:^|,)(\d+)-(\d+)(?![^,])/g;
  var REGEX_INDIVIDUAL = /(?:^|,)(\d+)(?![^,])/g;
  var m, res_rango = [], res_ind = [];
  while (m = REGEX_RANGO.exec(s)) {
    res_rango.push(m[1]);
    res_rango.push(m[2]);
  }
  while (m = REGEX_INDIVIDUAL.exec(s)) {
    res_ind.push(m[1]);
  }
  Logger.log(res_rango);
  Logger.log(res_ind);
}

Журнал результатов:

enter image description here

Регулярные выражения

Индивидуальный шаблон регулярных выражений:

(?:^|,)(\d+)(?![^,])

соответствует

  • (?:^|,) - начало строки или запятой
  • (\d+) - Группа захвата 1: одна или несколько цифр
  • (?![^,]) - отрицательный взгляд, который не соответствует совпадению, если следующий символ не является запятой (следующий символ после цифр должен быть запятой или концом строки).

Смысл в том, чтобы собирать только значения группы 1.

См. его онлайн демо

Шаблон регулярных выражений Ранго

(?:^|,)(\d+)-(\d+)(?![^,])

См. это онлайн демо

Соответствует:

  • (?:^|,) - группа без захвата, соответствующая началу строки или запятой
  • (\d+) - Группа 1: одна или несколько цифр
  • - - дефис
  • (\d+) - Группа 2: одна или несколько цифр
  • (?![^,]) - отрицательный взгляд, который не соответствует совпадению, если следующий символ не запятая.

Смысл в том, чтобы собирать только значения групп 1 и 2.

...