16

我正在尝试使用 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-(作为数组或连接文本)。

我知道可以使用脚本或其他函数(SPLITREGEX.*regex101.com上的“ g lobal - 第一次匹配后不返回”选项之类的东西

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

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

4

5 回答 5

16

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

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

基本上它所做的是\d-用“捕获组”包围所有实例,然后使用正则表达式提取,它巧妙地返回所有捕获。如果你想把它重新加入一个字符串,你可以使用 join 将它重新打包成一个单元格:

在此处输入图像描述

于 2017-04-18T07:43:27.973 回答
8

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

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- 用于加入匹配结果的文本。
于 2020-07-02T20:53:26.677 回答
4

Edit

I came up with more general solution:

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

It replaces any text except the second group match (\d-) with just the second group $2.

"(.)?(\d-)|(.)"
  1    2    3  
  Groups are in ()
  ---------------------------------------
 "$2" -- means return the group number 2

Learn regular expressions: https://regexone.com


Try this formula:

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

It will handle string like this:

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

with output:

1-2-2-2-3-

于 2017-04-19T13:18:50.607 回答
3

我无法为我的案件获得公认的答案。我想这样做,但需要一个快速的解决方案并采用以下方法:

输入:

1111 days, 123 hours 1234 minutes and 121 seconds

预期输出:

1111 123 1234 121

公式:

=split(REGEXREPLACE(C26,"[a-z,]"," ")," ")
于 2018-10-12T17:35:50.693 回答
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-

分析

我必须通过这些程序来说服自己这是正确的。根据此参考,当存在由管道符号分隔的替代方案时,正则表达式应按从左到右的顺序匹配它们。除非规则 1 首先出现,否则上述公式无法正常工作(否则它会将除数字或连字符之外的所有字符减少为空,然后规则 (1) 才能发挥作用,并且您会从“Patho-jour”中获得一个额外的连字符)。

以下是我认为它必须如何处理文本的一些示例

在此处输入图像描述

于 2017-04-16T11:35:37.127 回答