1

我正在编写一个采用以下形式的短文本令牌替换系统:

$varName(opt1|opt2|opt3)

它旨在根据任意值轻松交换事物,如下所示:

$gender(he|she)

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

有什么帮助吗?

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

编辑:

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

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

2 回答 2

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();
于 2012-11-23T04:36:34.370 回答
0

我想到了。

我忘记考虑选项中的数字。

\$[a-zA-Z]+\(([a-zA-Z0-9]+\|)+[a-zA-Z0-9]+\)
于 2012-11-23T04:18:31.847 回答