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 に答える