我有2个正则表达式可以在regex101上完美运行,但是在工作表脚本中,一个( REGEX_RANGO )在调用.test时返回false,而另一个( 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*
:
*001,002,003,010-015*
:
希望有人知道如何处理,谢谢。你可以找到我目前的尝试 here和here。
要清楚:这在regex101上有效,而不在Google Sheet上有效,也许是作用域还是我需要对正则表达式进行转义?
已编辑:
var REGEX_INDIVIDUAL = /((?<=,)|(?:^(\d)))[^(,|\-)]+(?=($|,))/gm;
var j = numeros_ingresados.match( REGEX_INDIVIDUAL )
SpreadsheetApp.getActiveSheet( ).getRange("F1").setValue( " >> j : " + j )
答案 0 :(得分:1)
请注意,您的模式中的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);
}
结果日志:
正则表达式详细信息
单个正则表达式模式为
(?:^|,)(\d+)(?![^,])
它匹配
(?:^|,)
-字符串或逗号开头(\d+)
-捕获第1组:一个或多个数字(?![^,])
-如果下一个字符不是逗号(数字后的下一个字符应为逗号或字符串末尾),则负匹配将使匹配失败。重点是仅收集第1组的值。
rango regex模式是
(?:^|,)(\d+)-(\d+)(?![^,])
它匹配:
(?:^|,)
-与字符串开头或逗号匹配的非捕获组(\d+)
-第1组:一个或多个数字-
-连字符(\d+)
-第2组:一个或多个数字(?![^,])
-如果下一个字符不是逗号,则否定超前匹配将失败。重点是仅收集组1和2的值。