6
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”

我要改变什么?

4

3 回答 3

10

您需要的称为lookbehind/lookahead。正则表达式具有此功能,您可以指定当前匹配字符串之后(或在本例中为之前)的内容。

[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);

编辑:如果您不想匹配“字段” ,这对您有好处!部分。一个稍微不同的任务是如果你想匹配它,但你还需要第二部分的 value。在这种情况下,我建议使用命名组,这将捕获整个事物,但您可以从 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;
   //...
}
于 2013-02-22T13:54:06.260 回答
9

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

(?<=Fields!)\w*

编辑添加简短说明:

(?<=foo)barbar仅在bar以下情况下才 匹配foo(foo 不会出现在匹配结果中)(?<=..)是肯定的向后看,零宽度断言。谷歌它的详细信息。

于 2013-02-22T13:43:28.640 回答
2

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

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

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

于 2013-02-22T13:49:22.140 回答