正则表达式匹配重复的可能字符集

时间:2012-11-23 03:54:30

标签: c# regex text

我正在编写一个短文本令牌替换系统,其格式为:

$varName(opt1|opt2|opt3)

它旨在根据以下任意值轻松换出内容:

$gender(he|she)

我认为获取和处理这些的最佳方法是匹配模式的正则表达式,但我无法弄清楚如何识别括号之间的选项,因为它们可以重复任意次数并且可能没有那么多管道字符作为选项。

任何帮助?

(我使用C#作为正则表达式主机)

编辑:

我尝试了这个,但它似乎只适用于带有2个选项的东西

\$[a-zA-Z]+\(([a-zA-Z]+\|)+[a-zA-Z]+\)

2 个答案:

答案 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]+\)