【问题标题】:Regex to match after specific characters正则表达式匹配特定字符后
【发布时间】:2013-02-22 21:56:17
【问题描述】:
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# regex


    【解决方案1】:

    您需要的是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# 命名组由尖括号给出,而不是引号......但无论如何命名组在这里并不是必需的,并且原始正则表达式已经有一个捕获组。
    • 对于命名组与捕获组:我发现使用名称而不是索引总是更好。
    • 非常感谢。这是非常详细的答案。很遗憾我不能同时接受第一个正确的和最详细的。再次感谢
    • 呵呵,今天我学到的是'...'而不是&lt;...&gt;。但是,在这样一个简单的正则表达式中,只有一组......
    【解决方案2】:

    不懂c#语法,正则表达式,试试:

    (?<=Fields!)\w*
    

    EDIT添加简短说明:

    (?&lt;=foo)bar 匹配 bar 仅当 bar 跟随 foo (foo 不会出现在匹配结果中)(?&lt;=..) 是肯定的后视,零宽度断言。谷歌了解详情。

    【讨论】:

    • 效果很好。谢谢!我是正则表达式的新手。你能解释一下这个人在做什么吗?
    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-03
      • 1970-01-01
      • 1970-01-01
      • 2023-02-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多