我有这两个字符串:
s = t
[ f ] s = t
使用此模式处理每个正则表达式:
(?<=]).*(?==|:)
我的目标是尝试检索" s " part (between the "]" and "=")
,"[ f ]" is optional
,正如您在第一行中看到的那样。
我尝试过在线发现并被其他人使用的许多不同模式,过去2小时也试图用引用,搜索引擎,反复试验来解决这个问题,但没有成功。
我将如何实现这一目标?我需要采用什么模式来实现这一目标?
答案 0 :(得分:1)
为什么不使用常规的.NET方法,而不是使用RegEx?永远记住正则表达式不是银子弹。需要几行代码的操作很快就会成为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
。
答案 1 :(得分:1)
您可以使用正则表达式执行此任务。基本上,s
必须是]
或行/字符串开头和=
符号之间的一些文字字符串。
所以,使用
(?:^\p{Zs}*|])([^]=]*)=
请参阅regex demo
正则表达式分解:
(?:^\p{Zs}*|])
- 一个匹配2个备选方案的非捕获组:
^\p{Zs}*
- 字符串/行的开头(取决于使用的RegexOptions
),后跟0个或更多水平空白符号或...... ]
- 文字]
符号([^]=]*)
- (捕获组1)0个或更多不是]
或=
的符号。=
- 文字=
符号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