如何告诉 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]*?(?:(?=\[\])|(?=\[\[\]\]))
使用上述正则表达式,无法捕获第一段文本的第二部分。
有没有办法告诉正则表达式在 'or' 部分贪婪?我想捕捉尽可能多的群体。
编辑 1:
最初的尝试:
编辑 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\].*(?:\[\[\]\]|\[\])
正文:
[A]I'm an example text [] But I want to be included [[]]
[A]I'm another text without a second part []
正则表达式:
\[A\][\s\S]*?(?:(?=\[\])|(?=\[\[\]\]))
使用上述正则表达式,无法捕获第一段文本的第二部分。
有没有办法告诉正则表达式在 'or' 部分贪婪?我想捕捉尽可能多的群体。
编辑 1:
最初的尝试:
编辑 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\].*(?:\[\[\]\]|\[\])