2015-12-01 165 views
1

我有这两个字符串:正则表达式检索字符串中的字符串

s = t 
[ f ] s = t 

,并处理每一个使用这种模式正则表达式:

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

我的目标是试图获取" s " part (between the "]" and "="),虽然"[ f ]" is optional,正如你在第一行中看到的那样。

我已经尝试了许多不同的模式,在网上找到并被别人使用,也花了最后2个小时试图找出与参考,搜索引擎,试验和错误,但没有成功。

我该怎么做到这一点?我需要什么样的模式才能实现这一目标?

+1

你在这里试图解决什么问题?一个例子不会削减它。 – nhahtdh

+0

如果你的目标是解析ini文件,然后https://stackoverflow.com/questions/217902/reading-writing-an-ini-file – nhahtdh

回答

1

您可以使用正则表达式来完成此任务。基本上,s必须是]或开始行/字符串和=符号之间的一些文本字符串。

因此,使用

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

regex demo

正则表达式崩溃:

  • (?:^\p{Zs}*|]) - 非捕获组匹配2层的替代品:
    • ^\p{Zs}* - 启动字符串/ li NE(取决于所用RegexOptions),接着0或多个水平空白符号或...
    • ] - 字面]符号
  • ([^]=]*) - 不在](捕获组1)0或多个符号或=
  • = - 字面=符号

C# Code

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); 
    } 

如果你需要让你通过Match.Value需要的值,你可以使用

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

这里是regex demo

+0

有没有额外的一点摆脱]和=在开始和结束,我意识到我可以在这一点子串,只是想知道。 –

+0

但是你没有把它们放在'G​​roups [1] .Value'中。如果你需要把's'作为'match.Value',你可以使用效率低得多的'var pattern = @“(?<=^\ p {Zs} * |])[^] =] * (==?)“;'。 –

+0

我正在使用.value,但它也得到了]和=,我不介意substringing,如果=符号是冒号还是等于? –

1

与其使用RegEx,为什么不使用常规的.NET方法?永远记住正则表达式不是银色子弹。需要几行代码的操作很快就会变成RegEx中令人费解的混乱。

你的情况下,可以通过下面的函数来解决:

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; 
} 

通过此功能运行代码成功地检索每行的s

+0

你是一个答案,一个很好的,虽然我故意要保持下线由于我自己的原因最小化,所以我想使用正则表达式出于这些原因。 –

相关问题