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
- 用于连接匹配结果的文本。
我正在尝试使用 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
- 捕获要提取的组 IDseparator
- 用于连接匹配结果的文本。