我有以下公式。 = INDEX(查找$ L $ 1:$ L $ 726 MAX(IF(ISERROR(FIND(查找$ L $ 1:!!!$ L $ 726 $ A1)), - 1,1)*(ROW(查找$ L $ 1 :$ 726 $大号)-ROW(查找$ L $ 1)+1)))
这个想法是从电子邮件中获取某个项目的时间(已经解析为google表格)。电子邮件有各种格式,因此我无法在文本字符串中指定具体位置。
时间并不总是以传统的时间格式编写,因此从公式中可以看出我有726种可能性。例如,有时候时间可以写成13:15,其他时间可以写成1:15甚至1.15或1-15等等。
我遇到的问题是上面的公式似乎从可能的最小字符串开始并且“向上”工作,因此从电子邮件字符串中提取3:15而不是13:15的全时字符串。有没有办法我可以修改公式来搜索最长的字符串,在那个例子中寻找13:15,然后只搜索3:15如果找不到前一个字符串。
希望这是有道理的。提前感谢您的任何帮助。
答案 0 :(得分:0)
一种方法是对726种可能性进行重新排序,以便首先获得较长的可能性。您可以通过使用=len(L1)
创建另一列,将该公式复制下来,并按此新列按降序排序范围来实现。
但是使用regexextract会更容易,因为正则表达式旨在解决您所面临的问题。例如,
=regexextract(L1, "\b\d{1,2}[:.-]\d{1,2}\b")
获取所有变种1:15,13:15,1-15或13.15。 (它查找以下序列:单词边界,1-2个数字,一个字符:,。, - ,然后1-2个数字,和另一个单词边界。)匹配是贪婪的,所以它会找到13:15时它在那里,而不仅仅是3:15。
更复杂的表格
=regexextract(L1, "(?i)\b\d{1,2}[:.-]\d{1,2} ?(?:am|pm)?\b")
也支持" am"或" pm"在时间之后,不区分大小写,并且可能与数字之间的空格分隔。
这可以进一步细化,例如小时部分将更精确地表示为[0-2]?\d
而不是\d{1,2}
,而分钟部分则表示为[0-6]?\d
。