为啥我没有得到正则表达式组值

Posted

技术标签:

【中文标题】为啥我没有得到正则表达式组值【英文标题】:Why am I not getting Regex group values为什么我没有得到正则表达式组值 【发布时间】:2021-11-23 23:40:30 【问题描述】:

从这个帖子回答得到了一些很大的帮助here

现在我正在尝试在我的多行字符串中捕获几个模式,但无法正常工作。有什么提示吗?

这是一个 .net fiddle 我正在玩

    desired result:
    //these can be letters
      
    1: 3333  
    2: 1111 

代码:

using System;
using System.Text.RegularExpressions;

public class Program

    public static void Main()
    
        var item = " john smith (ABCDEFG) <js@email.com>\n" + 
            "target1 = 3333, j\n" + 
            "target2 1111, ";
        String[] patternArr = "(?:\\s*)", 
                               "(?<target1>target1 = (\\w+)])", // capture the first target
                                "(?:\\s*)", 
                               "(?<target2>target2 (\\w+))", // captures the second target
 ;
        var pattern = String.Join("", patternArr);
        var m = Regex.Match(item, pattern);
        if (m.Success)
        
            Console.WriteLine("target1: 0", m.Groups["target1"]);
            Console.WriteLine("target2: 0", m.Groups["target2"]);
        
    

【问题讨论】:

注意\t"(?&lt;target2&gt;\target2 (\\w+))" 是一个TAB,我想你想要t。主要问题是您的正则表达式与那样的字符串不匹配。图案要求是什么?试试var pattern = @"target1 = (?&lt;target1&gt;.+)\ntarget2(?&lt;target2&gt;.+)";,或许能解决问题。 好的,刚刚更新了 OP。我只需要 4 个字母数字字符 【参考方案1】:

你可以使用

var pattern = @"target1 = (?<target1>\w+).*\ntarget2\s+(?<target2>\w+)";

请参阅regex demo。 正则表达式详细信息

target1 = - 文字字符串 (?&lt;target1&gt;\w+) - 组“target1”:一个或多个单词字符 .* - 该行的其余部分 \n - 换行符 target2 - 文字字符串 \s+ - 一个或多个空格 (?&lt;target2&gt;\w+) - 组“target2”:一个或多个单词字符

见C# demo:

using System;
using System.Text.RegularExpressions;
 
public class Program

    public static void Main()
    
        var item = " john smith (ABCDEFG) <js@email.com>\n" + 
            "target1 = 3333, j\n" + 
            "target2 1111, ";
        var pattern = @"target1 = (?<target1>\w+).*\ntarget2\s+(?<target2>\w+)";
        var m = Regex.Match(item, pattern);
        if (m.Success)
        
            Console.WriteLine("target1: 0", m.Groups["target1"]);
            Console.WriteLine("target2: 0", m.Groups["target2"]);
        
    

输出:

target1: 3333
target2: 1111

【讨论】:

还需要RegexOptions.Singeline 并删除\n,这样它的行数可能会多于两行 @Charlieface 如果是,我会提到。这些行在原始输入中是连续的。 我注意到如果我在项目值中交换目标,则不会发生匹配。你能帮我理解订单的重要性吗?如果我不知道哪个先出现怎么办? dotnetfiddle.net/7RGV6a @Rod 当然,给它纯文本:regex101.com/r/qIyYCV/2 @Rod 您在 regex101.com 上使用字符串文字,而您应该使用 纯文本。请熟悉this post。

以上是关于为啥我没有得到正则表达式组值的主要内容,如果未能解决你的问题,请参考以下文章

Qt正则表达式 如何得到字符串中所有满足条件的字符。这个正则为啥匹配不成功

亚马逊短网址正则表达式...为啥我不能让它工作

为啥这个正则表达式只在 Python 中的行首匹配? [复制]

为啥这个正则表达式模式不能按预期工作?

为啥在正则表达式中以某种方式忽略子后的第一个字符? [复制]

为啥这个正则表达式替换语句没有做任何事情? [复制]