我正在编写一个短文本令牌替换系统,其格式为:
$varName(opt1|opt2|opt3)
它旨在根据以下任意值轻松换出内容:
$gender(he|she)
我认为获取和处理这些的最佳方法是匹配模式的正则表达式,但我无法弄清楚如何识别括号之间的选项,因为它们可以重复任意次数并且可能没有那么多管道字符作为选项。
任何帮助?
(我使用C#作为正则表达式主机)
编辑:
我尝试了这个,但它似乎只适用于带有2个选项的东西
\$[a-zA-Z]+\(([a-zA-Z]+\|)+[a-zA-Z]+\)
答案 0 :(得分:1)
这样的事情应该有效:
string text = "$gender(he|she|it|alien)";
string pattern = @"\$(\w+)\(([\w\|]*)\)";
Match match = Regex.Match(text, pattern);
string varName = match.Groups[1].Value;
string[] values = match.Groups[2].Value.Split('|');
Console.WriteLine(varName + ": ");
foreach (string value in values)
{
Console.WriteLine(" " + value);
}
这是打印出来的:
gender:
he
she
it
alien
varName
具有变量的名称,然后values
是包含每个选项的字符串数组。
但是,如果您输入"$gender()"
没有值的内容,或者"$gender(he|she|)"
末尾有额外的管道,那么您将在结果中获得空字符串。如果这可能是个问题,请尝试:
string[] values = match.Groups[2].Value.Split('|').Where((s) => !string.IsNullOrEmpty(s)).ToArray();
答案 1 :(得分:0)
我明白了。
我忘了考虑选项中的数字。
\$[a-zA-Z]+\(([a-zA-Z0-9]+\|)+[a-zA-Z0-9]+\)