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

Multiple regex matches in Google Sheets formula

我正在尝试使用 Google Sheets 正则表达式获取给定字符串中连字符前的所有数字的列表(假设在单元格 A1 中):

=REGEXEXTRACT(A1, "\d-")

我的问题是它只有 return 第一场比赛... 我怎样才能得到 所有比赛

示例文本:

"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"

我的公式 returns 1-,而我想得到 1-2-2-2-2-2-2-2-2-2-3-3-(作为数组或串联文本)。

我知道我可以使用脚本或其他函数(如 SPLIT)来获得所需的结果,但我真正想知道的是如何获得 [=44= 的 re2 正则表达式] 在“REGEX.*”Google 表格公式中进行这样的多次匹配。 regex101.com[=20= 上的“global - 在第一次匹配 后不要return”选项]

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

感谢任何帮助! 谢谢:)

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

逻辑是

(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-

分析

我不得不按程序逐步完成这些步骤,以说服自己这是正确的。根据 this reference 当存在由管道符号分隔的备选方案时,正则表达式应按从左到右的顺序匹配它们。除非规则 1 先出现,否则上面的公式无法正常工作(否则它会在规则 (1) 起作用之前将除数字或连字符之外的所有字符减少为 null,并且您会从 "Patho-jour" 得到一个额外的连字符)。

这里有一些我认为它必须如何处理文本的例子

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

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

基本上它所做的是用 "capture group" 包围 \d- 的所有实例,然后使用正则表达式提取,它整齐地 returns 所有捕获。如果你想将它重新连接成一个字符串,你可以使用 join 将它打包回一个单元格:

编辑

我想出了更通用的解决方案:

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

它将除第二组匹配 (\d-) 之外的任何文本替换为第二组 </code>。</p> <pre><code>"(.)?(\d-)|(.)" 1 2 3 Groups are in () --------------------------------------- "" -- means return the group number 2

学习正则表达式:https://regexone.com


Try this formula:

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

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-

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

输入:

1111 days, 123 hours 1234 minutes and 121 seconds

预期输出:

1111 123 1234 121

公式:

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

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

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

或者,如果您需要 return 单个单元格中的所有匹配项,并使用一些分隔符连接:

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 - 用于连接匹配结果的文本。