正则表达式可捕获Google表格中模式之前的所有内容

时间:2018-09-08 08:08:20

标签: regex google-sheets re2

我很难找出Google表格中的正则表达式代码来检查单元格,然后返回包括新行\n在内的所有内容,并在特定模式\r之前返回\*+

更多背景信息:我在更大的REGEXEXTRACT(A:A,"...")中使用ArrayFormula格式,以便在添加新行时自动更新。这个人工作正常。这只是我遇到麻烦的正则表达式部分。

因此,出于这个问题的目的,我只担心在某种模式之前从A1单元中提取数据并在单元格B1中返回该值。这将我们带到单元格B1中的以下代码:

REGEXEXTRACT(A1,"...")

例如,这是我的A1电池的外观:

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus accumsan risus id ex dapibus sodales. 

Curabitur dui lacus, tincidunt vel ligula quis, volutpat mattis eros. 

In quis metus at ex auctor lobortis. Aliquam sed nisi purus. Sed cursus odio erat, ut tristique sapien interdum interdum. Morbi vel sollicitudin ante, non pellentesque libero. 

***********

Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Aenean egestas urna facilisis massa posuere, quis accumsan erat ornare. 

Curabitur at dapibus nibh. Nam nec vestibulum ligula. Phasellus bibendum mi urna, ac hendrerit libero interdum non. Suspendisse semper non elit aliquam auctor. 

Morbi vel sem tortor. Donec a sapien quis erat condimentum consequat in ut sem. Quisque in tellus sed est lobortis ultricies sed vitae enim.

我想在B1中返回此值:

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus accumsan risus id ex dapibus sodales. 

Curabitur dui lacus, tincidunt vel ligula quis, volutpat mattis eros. 

In quis metus at ex auctor lobortis. Aliquam sed nisi purus. Sed cursus odio erat, ut tristique sapien interdum interdum. Morbi vel sollicitudin ante, non pellentesque libero. 

模式*******之前基本上是什么。在Python中,我可以将re.DOTALL添加到.*中,但无法在Google表格中使用它。

4 个答案:

答案 0 :(得分:0)

要使点匹配换行,需要在模式中添加(?s)。要匹配任何字符,可以使用.。要匹配最左边的出现,请使用惰性量词*?。要真正提取您需要的子字符串,请用捕获括号包装您希望获取的部分模式。

因此,要匹配第一个*******子字符串,可以使用

(?s)^(.*?)\*\*\*\*\*\*\*

(?s)^(.*?)\*{7}。请参见regex demo(请注意,Go regex引擎也是RE2,因此您可以在regex101.com上测试模式)。

  • (?s)-DOTALL修饰符
  • ^-字符串的开头
  • (.*?)-组1:尽可能少包含0个字符
  • \*\*\*\*\*\*\*-7个文字星号符号。

请注意,如果您的子字符串可能包含*个字符,则不能依赖否定的字符类(与换行符匹配),也就是说,^([^*]*)\*\*\*\*\*\*\*在这种情况下不起作用。

如果您只想将任何字符匹配到字符串中的第一个*,则您的正则表达式将大大简化为

^([^*]+)

它匹配

  • ^-字符串的开头
  • ([^*]+)-捕获组1:*以外的一个或多个字符。

答案 1 :(得分:0)

尽管不是正则表达式可能适合想要相同结果但对方法不太特定的人:

  =ArrayFormula(LEFT(A1:A,Find("***********",A1:A)-3))

答案 2 :(得分:0)

如果您真的只想匹配第一个*之前的所有内容:

=REGEXEXTRACT(A1;"[^*]*")

如果您想在文本中只允许一个星,并且仅在行首停在多个(2个或更多)星(可能由换行符隔开)上,则可以尝试:

=REGEXEXTRACT(A1;"(?s)^(.*)\n(\*\n?){2,}")

但是您必须去除星星。例如

=REGEXREPLACE(REGEXEXTRACT(A1;"(?s)^(.*)\n(\*\n?){2,}"); "\n(\*\n?){2,}"; "")

提前行似乎在Google表格中似乎无效。

答案 3 :(得分:0)

python中的

re.DOTALL标志对应于re2中的(?s)单行模式标志。

Python:

  

(Dot.) In the default mode, this matches any character except a newline. If the DOTALL flag has been specified, this matches any character including a newline.

re2:

  

Flags: s let . match \n (default false)

所以

=REGEXEXTRACT(A1,"(?s)(.*?)\*")

这对应于re.findall()