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

时间:2013-02-22 13:39:23

标签: c# regex

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”

我应该改变什么?

3 个答案:

答案 0 :(得分:9)

您需要的是 lookbehind / lookahead 。正则表达式有this feature,你可以指定当前匹配的字符串后面(或者在这种情况下是前面的)。

[0-9](?=[a-z])将匹配任何一位数后跟一个小写字母 [0-9](?![a-z])将匹配任何一个数字,后跟小写字母。 (这被称为否定前瞻)
(?<=[a-z])[0-9]将匹配以小写字母开头的任何一位数字 (?<![a-z])[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);

编辑:如果您不想匹配“字段”,这对您有好处。部分。稍微不同的任务是如果你想匹配它,但你也需要第二部分的值。在这种情况下,我建议使用named groups,它将捕获整个内容,但您可以从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;
   //...
}

答案 1 :(得分:7)

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

(?<=Fields!)\w*

编辑添加简短说明:

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

答案 2 :(得分:2)

也许你可以试试这个......

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

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