正则表达式匹配特定字符后

var str = "=IIF(IsNothing(Fields!Metadata1.Value),"N/A",Fields!Metadata1.Value)"; var regexp = new Regex(@"Fields!(\w+)"); var matches = regexp.Matches(str); 

匹配将有“Fields!Metadata1”,而我需要获得“Metadata1”

我该怎么改变?

不知道c#语法,对于正则表达式,请尝试:

 (?<=Fields!)\w* 

编辑补充简短说明:

(?<=foo)bar只有当bar跟随foo时才匹配bar (foo不会出现在匹配结果中) (?<=..)是正面看后面,零宽度断言。 google了解详情。

你需要什么叫做lookbehind / lookahead 。 正则表达式具有此function ,您可以指定当前匹配的字符串后面(或在此情况下)。

[0-9](?=[az])将匹配任何一个数字后跟一个小写字母。
[0-9](?![az])将匹配任何一个数字NOT后跟一个小写字母。 (这称为负向前瞻)
(?<=[az])[0-9]将匹配以小写字母开头的任何一个数字。
(?将匹配任何一个前面没有小写字母的数字。(这称为负后观)

考虑到这一点,你想要的c#表达式是:

 var str = "=IIF(IsNothing(Fields!Metadata1.Value),"N/A",Fields!Metadata1.Value)"; var regexp = new Regex(@"(?<=Fields!)(\w+)"); var matches = regexp.Matches(str); 

编辑:如果你不想匹配 “菲尔兹”,这对你有好处! 部分。 稍微不同的任务是如果你想匹配它,但你还需要第二部分的值 。 在这种情况下,我建议使用命名组 ,它将捕获整个事物,但您可以从Groups集合中获取该部分。 在这种情况下的正则表达式将是: Fields!(?'fieldName'\w+) ,c#用法是

 var str = "=IIF(IsNothing(Fields!Metadata1.Value),"N/A",Fields!Metadata1.Value)"; var regexp = new Regex(@"Fields!(?'fieldName'\w+)"); var matches = regexp.Matches(str); foreach (Match m in matches) { var fieldName = m.Groups["fieldName"].Value; //... } 

也许你可以尝试这个……

var match = Regex.Match(item,@“!(\ w +)”);

然后得到match.Groups [1] .Value