我试图使用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
删除不需要的文字,也没有成功(我无法摆脱连字符前面的其他数字)。
任何帮助表示赞赏! 谢谢:))
答案 0 :(得分:6)
您实际上可以在单个公式中使用regexreplace来围绕具有捕获组的所有值而不是替换文本来执行此操作:
=join("",REGEXEXTRACT(A1,REGEXREPLACE(A1,"(\d-)","($1)")))
它的作用基本上是用“捕获组”围绕\d-
的所有实例然后使用正则表达式提取,它整齐地返回所有捕获。如果你想将它连接回一个字符串,你可以使用join将它打包回一个单元格中:
答案 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;。)
以下是我认为必须处理文本的一些例子
答案 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,]"," ")," ")