如何告诉 RegEx 在 'Or' 表达式上贪婪

How to tell a RegEx to be greedy on an 'Or' Expression

正文:

[A]I'm an example text [] But I want to be included [[]]
[A]I'm another text without a second part []

正则表达式:

\[A\][\s\S]*?(?:(?=\[\])|(?=\[\[\]\]))

使用上述正则表达式,无法捕获第一段文本的第二部分。

Demo

有没有办法告诉正则表达式在 'or' 部分贪婪?我想捕捉尽可能多的群体。

编辑 1:

最初的尝试:

Demo

编辑 2:

我想达到的目标:

在我们公司,我们使用网络服务来报告我们的工作时间。我想开发一个桌面应用程序来轻松地关注工作时间。我成功下载了服务器的响应(包含所有必要的数据)但不幸的是这个日期处于非常糟糕的状态来处理它。

因此我需要将整个页面拆分成不同的日期。不幸的是,一天可能有多个时间集,例如06:05 - 10:33; 10:55 - 13:13。上面发布的正则表达式在第一次设置后(所以在 10:33 之后)拆分天数数据集。因此,我希望正则表达式处理 Or-part "greedy"(如果表达式 1(较大的)为真,则跳过第二个表达式。如果表达式 1 为假,则使用第二个)。

您可以使用

\[A][\s\S]*?(?=\[A]|$)

参见regex demo

详情

  • \[A] - [A] 子串
  • [\s\S]*? - 任何 0+ 个字符尽可能少
  • (?=\[A]|$) - 紧跟 [A] 或字符串末尾的位置。

在 C# 中,您实际上甚至可以使用拆分操作:

Regex.Split(s, @"(?!^)(?=\[A])")

看到这个 .NET regex demo(?!^)(?=\[A]) 正则表达式匹配字符串中不在开头且紧跟 [A].

的位置

如果 A 可以是任何字母,则将 A 替换为 [A-Z][A-Z]+

我已经改变了你的正则表达式(实际上更简单)来做你想做的事:

\[A\].*\[?\[\]\]?

它首先匹配'[A]',然后匹配任意数量的任意字符(贪心),最后匹配一两个'[]'。

编辑:

这将首选双方括号:

\[A\].*(?:\[\[\]\]|\[\])