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”
我要改变什么?
最佳答案
您需要的是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;
//...
}
关于c# - 在特定字符后匹配的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15025545/