c# - 在特定字符后匹配的正则表达式

标签 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”

我要改变什么?

最佳答案

您需要的是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/

相关文章:

C# 异步等待任务 : cannot await 'void'

regex - PHP中[\w\-]正则表达式是什么意思

java - 如何使用 Java 正则表达式解析骰子符号?

c# - 在服务器和客户端上一致地存储 DateTime

python - 如何在Python中使用正则表达式获取结束字符串?

c++ - 在 Qt 中捕获标签内的数字

java - 将此 Objective-C 方法转换为 Android 的 Java 的正确方法是什么?

c# - WPF - 需要在禁用的 DataGrid 中启用滚动

c# - ILSpy 中显示的奇怪的类成员语法

c# - JSON.Net 错误地将二维数组序列化为一维