regex 查找正则表达式中匹配的子模式

0x6upsns  于 2023-08-08  发布在  其他
关注(0)|答案(1)|浏览(77)

是否可以通过正则表达式找到字符串中匹配的子模式,假设我们想通过“\d{1,}D{1,}”检查“2D 3”。

string pattern  = "\d{1,}D\d{1,}";
string str = "2D3";
var r = new Regex(pattern)
if(r.IsMatch(str))
{
   Dictionary<string, string> Out = new Dictionary<string, string>();
   //Some Code Here???
   Log(Out);
}

/////////////Out Must Be/////////
({"\d{1,}", "2"},
{"D", "D"},
{"\d{1,}", "3"})
////////////////////////////////

字符串

ukxgm1gy

ukxgm1gy1#

正如注解中所提到的,您正在尝试获取每个组的值,因此您需要在正则表达式模式中使用捕获组()

(\d{1,})(D)(\d{1,})

字符串
并提供索引以获取每个组的值。

string pattern  = @"(\d{1,})(D)(\d{1,})";
string str = "2D3";
var r = new Regex(pattern);
Match match = r.Match(str);

if (match.Success)
{
    Console.WriteLine("1st capturing group: {0}", match.Groups[1]); 
    Console.WriteLine("2nd capturing group: {0}", match.Groups[2]); 
    Console.WriteLine("3rd capturing group: {0}", match.Groups[3]); 
}


我不认为没有捕获组,你可以根据正则表达式(部分)按部分捕获每个值。如果您允许用户按@AdrianHHH提到的部分/组输入正则表达式,那么您可以通过分别在前端和后端添加()来操作正则表达式模式。
由于您希望捕获每个正则表达式模式及其相应的匹配值,因此将两个值存储在Dictionary中并不是一个好的选择,因为Dictionary不允许存储相同的键。

List<dynamic> Out = new List<dynamic>();
List<string> patternGroups = new List<string> { @"\d{1,}", "D", @"\d{1,}" };

string pattern  = String.Join("", patternGroups.Select(x => $"({x})"));
string str = "2D3";
var r = new Regex(pattern);
Match match = r.Match(str);

if (match.Success)
{           
    for (int i = 0; i < patternGroups.Count; i++)
    {
        Out.Add(new 
                { 
                    Regex = patternGroups[i], 
                    Value = match.Groups[i + 1].Value 
                });
    }
}

相关问题