C# 在字符串中检索字符串的正则表达式

C# 在字符串中检索字符串的正则表达式,c#,regex,ini,C#,Regex,Ini,我有两条线: s = t [ f ] s = t 并使用此模式使用正则表达式处理每个: (?<=]).*(?==|:) (?与其使用正则表达式,为什么不使用正则.NET方法呢?请始终记住正则表达式不是万能的。只需几行代码的操作很快就会在正则表达式中变成一团混乱 您的案例可以通过以下功能解决: static string GetKey(string line) { string result = line.Split('=')[0]; if (result.Inde

我有两条线:

 s = t 
 [ f ] s = t
并使用此模式使用正则表达式处理每个:

(?<=]).*(?==|:)

(?与其使用正则表达式,为什么不使用正则.NET方法呢?请始终记住正则表达式不是万能的。只需几行代码的操作很快就会在正则表达式中变成一团混乱

您的案例可以通过以下功能解决:

static string GetKey(string line)
{
    string result = line.Split('=')[0];
    if (result.IndexOf('[') < result.IndexOf(']')) // preceded by an optional group
        result = result.Split(']')[1];

    return result;
}
静态字符串GetKey(字符串行)
{
字符串结果=line.Split('=')[0];
if(result.IndexOf('[')

通过此函数运行代码可以成功检索每行上的
s

您可以使用正则表达式执行此任务。基本上,
s
必须是介于
]
或行/字符串的开头和
=
符号之间的文本字符串

所以,使用

(?:^\p{Zs}*|])([^]=]*)=

正则表达式细分:

  • (?:^\p{Zs}*|])
    -一个非捕获组匹配两个备选方案:
    • ^\p{Zs}*
      -字符串/行的开头(取决于使用的
      RegexOptions
      ),后跟0个或更多水平空白符号或
    • ]
      -文字符号
  • ([^]=]*)
    -(捕获组1)0个或多个不是
    ]
    =
    的符号
  • =
    -文字符号
    =
:


以下是

您试图解决的问题是什么?一个简单的例子并不能解决它。如果您的目标是解析ini文件,那么在开始和结束时是否有额外的一点需要去掉“]和“=”,我意识到我可以在这一点上进行子串,只是想知道。但是您在
组[1]中没有得到它们.Value
。如果需要将
s
作为
匹配.Value
,可以使用效率低得多的
var pattern=@”(?我使用的是.Value,但它也会得到]和=,我不介意子字符串,=号是冒号还是等号?您需要的值可以通过访问
match.Groups[1]获得.Value
对于我的原始答案,可能是因为捕获组(圆括号)在将匹配子字符串的一部分捕获到一个单独缓冲区的模式中。在查找无效的情况下使用捕获组是最佳做法。但是我之前的评论中的正则表达式应该对您很有用,即使使用
match.Value
。它起作用了!您的答案很好,尽管我有意保持一致因为我自己的原因,它降到了最低,所以我想使用正则表达式。
var strs = new List<string> { " [ f ] s = t", "s = t"};
var pattern = @"(?:^\p{Zs}*|])([^]=]*)=";
foreach (var s in strs)
{
    var match = Regex.Match(s, pattern);
    if (match.Success)
        Console.WriteLine(match.Groups[1].Value);
   }
@"(?<=^\p{Zs}*|])[^]=:]*(?=[=:])"