正则表达式 - 在某种模式后开始匹配

时间:2018-04-30 19:19:26

标签: .net regex

我在尝试使用正则表达式查找内容时遇到了麻烦。

我有以下正则表达式

([{\-\+~a-zA-Z0-9]+){3,}

它应该按原样运行,但是,我需要捕获某个特定字符后的所有可能匹配项,在本例中为}

faz.}a..sd..3·$....................foo....e..P...0...................bar

foobar必须匹配,但faz不应该匹配。请注意,我无法使用.+(?=}),因为它会将}之后的所有内容捕获到一个匹配项中。我在互联网上搜索,每个答案都提出了这种模式。

提前致谢。

2 个答案:

答案 0 :(得分:1)

在.NET中,您可以使用正可变长度lookbehind来匹配模式出现仅在某个char / substring / pattern之后:

(?<=}.*)[-{+~a-zA-Z0-9]{3,}
^^^^^^^^

请参阅regex demo

<强>详情

  • (?<=}.*) - 一个}(以及换行以外的任何0 +字符)应该出现在随后的消耗模式部分之前
  • [-{+~a-zA-Z0-9]{3,} - 字符类中列出的3个或更多字母,数字和一些标点/符号字符。

您也可以检查相反的方法:如果没有}后面的话,请匹配您需要的字词:

[-{+~a-zA-Z0-9]{3,}(?![^}]*})

请参阅this regex demo

此处,(?![^}]*})是一个否定前瞻,如果在“{”之后的}以外的任何0 +字符之后有一个},那么匹配就会失败[-{+~a-zA-Z0-9]{3,}模式。

答案 1 :(得分:0)

使用简化且更快的 CaptureCollection

立即获取所有内容

(?s)}(?:.*?([{\-+~a-zA-Z0-9]{3,}))+

阅读版本

 (?s)
 }
 (?:
      .*? 
      ( [{\-+~a-zA-Z0-9]{3,} )      # (1)
 )+

C#

string inp = @"faz.}a..sd..3·$....................foo....e..P...0...................bar";
Regex Rx1 = new Regex( @"(?s)}(?:.*?([{\-+~a-zA-Z0-9]{3,}))+" );
Match M1 = Rx1.Match( inp );
if ( M1.Success )
{
    CaptureCollection cc = M1.Groups[1].Captures;
    for (int i = 0; i < cc.Count; i++)
        Console.WriteLine("{0}", cc[i].Value);
}

输出

foo  
bar  
Press any key to continue . . .