我在尝试使用正则表达式查找内容时遇到了麻烦。
我有以下正则表达式
([{\-\+~a-zA-Z0-9]+){3,}
它应该按原样运行,但是,我需要捕获某个特定字符后的所有可能匹配项,在本例中为}
。
faz.}a..sd..3·$....................foo....e..P...0...................bar
foo
和bar
必须匹配,但faz
不应该匹配。请注意,我无法使用.+(?=})
,因为它会将}
之后的所有内容捕获到一个匹配项中。我在互联网上搜索,每个答案都提出了这种模式。
提前致谢。
答案 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 . . .