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

问题描述 投票:1回答:4

我很难搞清楚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表格中使用它。

regex google-sheets re2
4个回答
0
投票

要使点匹配换行,您需要将(?s)添加到模式中。要匹配任何字符,您可以使用.。要匹配最左边的事件,请使用lazy quantifier,*?。要实际提取您需要的子字符串,请使用捕获括号来包装您感兴趣的模式部分。

因此,为了匹配第一个*******子串,您可以使用

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

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

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

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

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

^([^*]+)

它匹配

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

0
投票

虽然不是正则表达式可能适合想要相同结果的人,但不太适合该方法:

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

0
投票

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

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

如果您想在文本中允许单个星形并且仅在一行的开头处停留多个(2个或更多)星(可能除以换行符),您可以尝试:

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

但你必须剥去星星。例如。

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

在Google表格中,预测似乎不起作用。


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

© www.soinside.com 2019 - 2024. All rights reserved.