Google表格公式中的多个正则表达式匹配

时间:2017-04-16 00:02:31

标签: regex google-sheets re2

我试图使用Google表格正则表达式公式获取给定字符串中连字符前面的所有数字列表(让我们在单元格A1中说明):

=REGEXEXTRACT(A1, "\d-")

我的问题是它只会返回第一场比赛... 我如何才能所有比赛

示例文字:

"A1-Nutrition;A2-ActPhysiq;A2-BioMeta;A2-Patho-jour;A2-StgMrktg2;H2-Bioth2/EtudeCas;H2-Bioth2/Gemmo;H2-Bioth2/Oligo;H2-Bioth2/Opo;H2-Bioth2/Organo;H3-Endocrino;H3-Génétiq"

我的公式返回1-,而我想得到1-2-2-2-2-2-2-2-2-2-3-3-(作为数组或连接文本)。

我知道我可以使用脚本或其他函数(如SPLIT)来实现所需的结果,但我真正想知道的是如何获得re2正则表达式来返回这样的多个匹配" REGEX.*" Google表格公式。 类似于" g lobal - 在第一场比赛后没有回复" regex101.com

上的选项

我还尝试用REGEXREPLACE删除不需要的文字,也没有成功(我无法摆脱连字符前面的其他数字)。

任何帮助表示赞赏! 谢谢:))

5 个答案:

答案 0 :(得分:6)

您实际上可以在单个公式中使用regexreplace来围绕具有捕获组的所有值而不是替换文本来执行此操作:

=join("",REGEXEXTRACT(A1,REGEXREPLACE(A1,"(\d-)","($1)")))

它的作用基本上是用“捕获组”围绕\d-的所有实例然后使用正则表达式提取,它整齐地返回所有捕获。如果你想将它连接回一个字符串,你可以使用join将它打包回一个单元格中:

enter image description here

答案 1 :(得分:3)

您可以在脚本编辑器中创建自己的自定义函数:

function ExtractAllRegex(input, pattern,groupId) {
  return Array.from(input.matchAll(new RegExp(pattern,'g')), x=>x[groupId]);
}

或者,如果您需要在带有分隔符的单个单元格中返回所有匹配项:

function ExtractAllRegex(input, pattern,groupId,separator) {
  return Array.from(input.matchAll(new RegExp(pattern,'g')), x=>x[groupId]).join(separator);
}

然后,像=ExtractAllRegex(A1, "\d-", 0, ", ")这样称呼它。

说明

  • input-当前单元格值
  • pattern-正则表达式模式
  • groupId-捕获要提取的组ID
  • separator-用于加入匹配结果的文本。

答案 2 :(得分:2)

这似乎有效,我试图验证它。

逻辑是

(1)替换字母后跟连字符

(2)替换任何没有连字符的数字

(3)替换所有不是数字或连字符的东西

=regexreplace(A1,"[a-zA-Z]-|[0-9][^-]|[a-zA-Z;/é]","")

结果

1-2-2-2-2-2-2-2-2-2-3-3-

<强>分析

我必须在程序上逐步说服自己这是正确的。根据{{​​3}},当管道符号分隔的替代项时,正则表达式应按从左到右的顺序匹配它们。除非规则1首先出现,否则上述公式无法正常工作(否则,在规则(1)可以发挥作用之前,它会将除数字或连字符之外的所有字符减少为空,并且您将从&#34; Patho-获得额外的连字符怨妇&#34;。)

以下是我认为必须处理文本的一些例子

this reference

答案 3 :(得分:2)

修改

我提出了更一般的解决方案:

=regexreplace(A1,"(.)?(\d-)|(.)","$2")

  

试试这个公式:

     

=regexreplace(regexreplace(A1,"[^\-0-9]",""),"(\d-)|(.)","$1")

     

它将处理这样的字符串:

     

"A1-Nutrition;A2-ActPhysiq;A2-BioM---eta;A2-PH3-Généti***566*9q"

     

带输出:

     

1-2-2-2-3-

答案 4 :(得分:1)

我无法获得可接受的答案来处理我的案件。我想这样做,但是需要一个快速的解决方案,并执行以下操作:

输入:

1111 days, 123 hours 1234 minutes and 121 seconds

预期输出:

1111 123 1234 121

公式:

=split(REGEXREPLACE(C26,"[a-z,]"," ")," ")