首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >包含由OR条件分隔的多个规则的正则表达式中命中的条件数

包含由OR条件分隔的多个规则的正则表达式中命中的条件数
EN

Stack Overflow用户
提问于 2013-05-20 18:53:42
回答 4查看 647关注 0票数 0

我有一个带OR条件的正则表达式。我想要找出正则表达式中用'|‘分隔的所有条件中满足的条件数。

示例:(.*Begin.*)|(.*Middle.*)|(.*End.*)

我还有一个类似于:"Hello this is Begin.Hello this is Middle."的字符串

现在,如果您看到正则表达式中的3个或条件中有2个将在此规则中命中。我想找出命中的条件数。

我不想根据'|‘拆分正则表达式,然后分别应用每个正则表达式,我希望一次运行整个正则表达式。

在我们搜索的字符串中,子匹配的顺序并不总是Begin--> order ->End。这是一个完全随机的字符串,我们在其中应用正则表达式,其中包含组合到一个正则表达式中的条件。我想知道Regex中有多少这样的条件被击中了。

EN

回答 4

Stack Overflow用户

发布于 2013-05-23 01:12:28

简而言之,使用标准交替是不可能的。文本一旦匹配,就不能再匹配了。此外,一旦满足表达式,它将不会继续搜索。如果正则表达式试图匹配每一个可能的排列,它们将是非常无效的,没有人会使用它们。

虽然我能找到的文档中没有明确地解决你的问题,但它在回溯的主题下涵盖了。请参阅MSDN的Backtracking with Optional Quantifiers or Alternation Constructs

本质上,您的备选列表(.|.|.)为回溯创造了一个机会。如果第一个替换项不匹配,则将尝试第二个替换项。但是,这种回溯不会发生,除非第一个替代失败,并且一旦进行匹配,所有其他替代都将被忽略。

如果你想匹配多个表达式,你可以像这样使用lookahead:

代码语言:javascript
代码运行次数:0
运行
复制
string l_pattern = @"(?i)" + /*make the regex case-insensitive*/
                   @"(?=(?<Cond1>.*?Begin)+)?" +
                   @"(?=(?<Cond2>.*?Middle)+)?" +
                   @"(?=(?<Cond3>.*?End)+)?";

string l_input = "Oops - I put the middle first!" + 
                 "Hello this is Begin.This is another begin.";

var l_match = Regex.Match( l_input, l_pattern );

Console.WriteLine( "Cond1 matched {0} times.",
                   l_match.Groups["Cond1"].Captures.Count );
Console.WriteLine( "Cond2 matched {0} times.",
                   l_match.Groups["Cond2"].Captures.Count );
Console.WriteLine( "Cond3 matched {0} times.",
                   l_match.Groups["Cond3"].Captures.Count );

Console.ReadKey( true );

这将输出:

Cond1匹配2次。

Cond2匹配1次。

Cond3匹配0次。

Lookahead不捕获任何文本,因此它们的功能有点像regex中的一个迷你正则表达式。从本质上讲,这个表达式与单独运行所有三个表达式没有什么不同。(请注意,每个lookahead都是可选的,否则如果任何一个lookahead失败,整个表达式都会失败。)

还请注意,当使用lookaheads时,如我所示,顺序并不重要。

有关lookaheds的更多信息,请参阅MSDN的Zero-width positive lookahead assertions。这个话题有点太大了,不能完全回答这个问题。

我不能说我推荐这种方法超过所有其他方法-如果你不熟悉正则表达式,它可能很难维护,而且它不一定是最有效的模式,但它符合你声明的需求。

票数 2
EN

Stack Overflow用户

发布于 2013-05-20 19:27:27

代码语言:javascript
代码运行次数:0
运行
复制
Regex regexObj = new Regex("Begin|Middle|End");
allMatchResults = regexObj.Matches(subjectString);
numberOfMatches = allMatchResults.Count
票数 0
EN

Stack Overflow用户

发布于 2013-05-20 19:28:04

如果正则表达式片段与互斥的语言集匹配(或者更弱但更难验证的条件是它们与输入字符串中不重叠的子字符串匹配),则可以找到所有匹配项并计算构成字符串中匹配项的捕获组的数量。

如果正则表达式片段与重叠的子字符串匹配,那么最简单的方法是尝试将每个正则表达式片段与字符串和计数进行匹配。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16647940

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档