これは私が扱っている文字列の例です
{Hi|Hello|Holla} {James{ey|o|ing}|Bob{bie|bey}}
{} の例の間の値を抽出するには、正規表現が必要です。
Hi|Hello|Holla
James{ey|o|ing}
Bob{bie|bey}
元の弦はスピンタックスと呼ばれています。私のプログラムは、各 {} ブロックに囲まれたランダムな値を選択します。ネストされた {} ブロックはかなり深くなる可能性があります。
正規表現は、ネストされた {} ブロックを無視して {} 間の値を抽出する必要があります。次に、ネストされた {} ブロック内のパイプが触れられないように、ネストされた {} ブロックを再び無視してパイプ (|) で値を分割します。
それは理にかなっていますか?
String メソッドを使用して部分的なソリューションを実装しましたが、パイプで分割すると、ネストされた {} 内のパイプも分割されます。これは予想されることですが、ネストされた {} を無視する方法がわかりません。
public String spintaxParse(String s)
{
// TODO: Implement logic to check for {} within String.
if (s.Contains('{'))
{
int firstOccuranceOfOpenBrace = s.IndexOf('{');
while (s[firstOccuranceOfOpenBrace + 1].Equals('{'))
firstOccuranceOfOpenBrace++;
int firstOccuranceOfClosingBrace = s.Substring(firstOccuranceOfOpenBrace).IndexOf('}');
String spintaxBlock = s.Substring(firstOccuranceOfOpenBrace, firstOccuranceOfClosingBrace + 1);
String[] items = spintaxBlock.Substring(1, spintaxBlock.Length - 2).Split('|');
Random rand = new Random();
s = s.Replace(spintaxBlock, items[rand.Next(items.Length)]);
return spintaxParse(s);
}
else
{
return s;
}
}