Google Apps脚本Regexes:括号与内容匹配困难

时间:2014-01-29 21:43:44

标签: regex google-apps-script escaping

我正在为Google Apps脚本中的电子表格构建自定义功能,并且遇到了障碍。

我需要做的是获取单元格的内容并将“0”的条目替换为“5”,并删除“(immobile)”(如果存在)(并且可能并不总是存在),留下其他所有内容完整。单元格内容可能如下所示: “0英尺(不动)” “0英尺。” “0英尺,飞20英尺。” “0英尺(不动),飞20英尺。”

0英尺将始终位于输入的开头,而(不动)(如果存在)将始终是下一个非白色空间。

我已经建立了几个正则表达式,我无法让它与一组只是“(不动)”相匹配。为了简化事情,我目前只是尝试匹配和捕获,而不是替换,但也适合。这是我到目前为止所得到的:

function getPlantSpeed(plantSpeed){
  var mySpeedRE = /^(0)( ft\..*?)(\(immobile\))?(.*)$/i;
  var testCaptures = mySpeedRE.exec(plantSpeed);
  return testCaptures;
} 
getPlantSpeed("0 ft. (immobile)"); 
getPlantSpeed("0 ft., swim 30 ft."); 
getPlantSpeed("0 ft. (immobile), swim 30 ft.");

每个捕获最终看起来像: “0英尺。(不动”,“0”,“英尺。”,未定义,“(不动)” “0英尺,游泳30英尺。”,“0”,“英尺。”,未定义,“游泳30英尺”。 和 “0英尺(不动),游30英尺。”,“0”,“英尺。”,未定义,“(不动),游30英尺。”

分别

我试过改变了吗?在尝试匹配(不动)到{0,1}和*之后,分别没有任何改变。我似乎无法单独匹配“(固定)”。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

好的,这个怎么样:

/^(0)( ft\.).*?(\(immobile\)|.*)$/i

这里有正则表达式的例子:

http://regex101.com/r/iS6zD3

这里有工作的jsfiddle:

http://jsfiddle.net/7KWKz/1/

你上一个正则表达式的主要问题是,你有4个捕获组,所以你得到了4个捕获,并且没有匹配的地方,你得到'未定义',因为你仍在捕获它。

注意我的答案有3个捕获组,在最后一组中带有OR运算符(|)。

为了简化,我不确定为什么你不能这样做:

/^(0)( ft\.)(.*)$/i

它返回相同的结果。

希望这有帮助!


编辑: 在阅读OP的评论后,我意识到我误解了他的问题......

好的,这里的javascript正在完成所要求的内容:

引用 - "replace an entry of "0" with "5", and remove "(immobile)" if present (and it might not always be present), leaving everything else intact."

使用Javascript:

function getPlantSpeed(plantSpeed){
  var mySpeedRE = /^(0)\s(ft\.)[\s]*(\(immobile\))?(,.*)?$/i;
  var replce = plantSpeed.replace(mySpeedRE, "5 $2$4");
  return replce;
} 
console.log(getPlantSpeed("0 ft. (immobile)")); 
console.log(getPlantSpeed("0 ft., swim 30 ft.")); 
console.log(getPlantSpeed("0 ft. (immobile), swim 30 ft."));
console.log(getPlantSpeed("0 ft."));

输出:

5 ft.
5 ft., swim 30 ft.
5 ft., swim 30 ft.
5 ft.

jsfiddle例子:

http://jsfiddle.net/7KWKz/2/