正则表达式匹配可选组,由任何字符分组包围

里克·高德(Ric Gaudet)

我正在尝试匹配一个可选的组,该组可以在任意数量的字符之前和之后。整个模式还具有必需的开始和结束匹配,但是中间匹配是可选的。

我从此开始,它在需要中间组时起作用:

string text = @"blah blah foo This is a test blah.  the test does not work. bar";
string  requiredBlah = @"(foo).*?(blah).*?(bar)";
Match m = Regex.Match(text, requiredBlah);

结果为“ foo”,“ blah”,“ bar”。

但是,当中间组是可选的时,我猜想正则表达式引擎的机制倾向于不匹配中间组。

string optionalBlah = @"(foo).*?(blah)?.*?(bar)";

结果:“ foo”,“”,bar“。

这样的回答说,如果在可选组之前和之后存在定界符,那么我可以捕获中间的可选组,但这不是我的情况。

我可以完全跳过可选组并使用string.Contains("blah"),但是我想知道是否存在针对此类问题的纯正则表达式解决方案。我的目标是设计匹配具有多个可选部分的通用模式的正则表达式,以便我可以确定模式的哪些部分丢失。

维克多·史翠比维

这个问题很普遍。第二个点匹配模式抓住了blah,不必将其返回,(blah)?因为它是可选的(请参阅此演示,其中我在原始正则表达式中添加了捕获组以显示匹配的组blah)。

在此处输入图片说明

最简单的解决方案是将惰性.*?模式和(blah)捕获组封装到一个可选的非捕获组(即(?:.*?(blah))?)中,以使regex引擎尝试至少一次匹配组模式(=贪婪):

(foo)(?:.*?(blah))?.*?(bar)

请参阅regex演示在这里,组1中的(foo)捕获匹配尽可能少的0或多个除换行符以外的其他字符的可选序列,然后捕获到组2中,然后匹配除行中断char之外的0个或多个字符,并尽可能少地匹配然后捕获到第3组:foo(?:.*?(blah))?blah.*?(bar)bar

在此处输入图片说明

另一种解决方案是使用先行限制点匹配(使用所谓的“钢化贪婪令牌”):

(foo)(?:(?!blah).)*(blah)?.*?(bar)
     ^^^^^^^^^^^^^^

请参阅regex演示(?:(?!blah).)*模式匹配任何文本,直到第一个blah(如果它在模式的末尾,则它也可能匹配到字符串的末尾。)

在此处输入图片说明

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

带可选匹配组的正则表达式

来自分类Dev

与可选第二组匹配的正则表达式

来自分类Dev

检查正则表达式是否与可选组匹配

来自分类Dev

正则表达式:将可选字符串匹配到组

来自分类Dev

可选的正则表达式字符组

来自分类Dev

可选的正则表达式字符组

来自分类Dev

正则表达式匹配一组字符,但前提是未对特定字符进行分组

来自分类Dev

正则表达式:匹配任何组

来自分类Dev

正则表达式匹配任何字符或不匹配?

来自分类Dev

正则表达式匹配地址中的任何字符串组

来自分类Dev

正则表达式:包含由非字母字符包围的字母字符的单词

来自分类Dev

正则表达式可选匹配

来自分类Dev

正则表达式可选匹配

来自分类Dev

正则表达式与特殊字符组匹配

来自分类Dev

正则表达式模式以匹配未被特殊字符包围的字符

来自分类Dev

正则表达式匹配任何字符,包括空格

来自分类Dev

匹配任何字符串正则表达式

来自分类Dev

正则表达式匹配括号内的任何字符

来自分类Dev

匹配任何字符串正则表达式

来自分类Dev

正则表达式匹配(包括)之间的任何字符{}

来自分类Dev

正则表达式-跨多行匹配任何字符

来自分类Dev

当任何字符串至少包含三个字符且正号由至少三个字符包围时匹配的正则表达式

来自分类Dev

正则表达式:至少一个空格,任何字符都包围

来自分类Dev

正则表达式:如何匹配某些字符所包围的内容?

来自分类Dev

正则表达式匹配组

来自分类Dev

正则表达式 - 被字母或空格包围的特殊字符

来自分类Dev

如何创建可选择性匹配一组字符但忽略数字的正则表达式?

来自分类Dev

如何使用基于字符的正则表达式将值匹配到单独的可选组中?

来自分类Dev

如何在python中使用正则表达式re.sub()可选匹配组?

Related 相关文章

  1. 1

    带可选匹配组的正则表达式

  2. 2

    与可选第二组匹配的正则表达式

  3. 3

    检查正则表达式是否与可选组匹配

  4. 4

    正则表达式:将可选字符串匹配到组

  5. 5

    可选的正则表达式字符组

  6. 6

    可选的正则表达式字符组

  7. 7

    正则表达式匹配一组字符,但前提是未对特定字符进行分组

  8. 8

    正则表达式:匹配任何组

  9. 9

    正则表达式匹配任何字符或不匹配?

  10. 10

    正则表达式匹配地址中的任何字符串组

  11. 11

    正则表达式:包含由非字母字符包围的字母字符的单词

  12. 12

    正则表达式可选匹配

  13. 13

    正则表达式可选匹配

  14. 14

    正则表达式与特殊字符组匹配

  15. 15

    正则表达式模式以匹配未被特殊字符包围的字符

  16. 16

    正则表达式匹配任何字符,包括空格

  17. 17

    匹配任何字符串正则表达式

  18. 18

    正则表达式匹配括号内的任何字符

  19. 19

    匹配任何字符串正则表达式

  20. 20

    正则表达式匹配(包括)之间的任何字符{}

  21. 21

    正则表达式-跨多行匹配任何字符

  22. 22

    当任何字符串至少包含三个字符且正号由至少三个字符包围时匹配的正则表达式

  23. 23

    正则表达式:至少一个空格,任何字符都包围

  24. 24

    正则表达式:如何匹配某些字符所包围的内容?

  25. 25

    正则表达式匹配组

  26. 26

    正则表达式 - 被字母或空格包围的特殊字符

  27. 27

    如何创建可选择性匹配一组字符但忽略数字的正则表达式?

  28. 28

    如何使用基于字符的正则表达式将值匹配到单独的可选组中?

  29. 29

    如何在python中使用正则表达式re.sub()可选匹配组?

热门标签

归档