Spintax C#...我该如何处理?

Sia*_*lis 4 c# spintax

Spintax允许您旋转各种单词和句子,例如:

{Hello|Hi} {World|People}! {C{#|++|}|Java} is an {awesome|amazing} language.
Run Code Online (Sandbox Code Playgroud)

大括号之间的文本将随机选择以形成不同的句子.

我自己可能想出一个解决方案,但我遇到的问题是嵌套.有时嵌套可能非常深.处理嵌套的可能解决方案是什么?

我无法收集所需的逻辑.

pax*_*blo 9

不要担心嵌套,只需按以下方式迭代执行:

  1. 找到字符串中{...}没有其他大括号的第一个序列.对于你的情况,那是{Hello|Hi}.如果没有该模式,请转到步骤3.

  2. 抓住所有可能性并选择一个随机的,用它的值替换支撑部分.然后回到第1步.

  3. 有你修改过的字符串.

假设您有一个稍微有缺陷的随机数生成器,它始终返回零.您的字符串修改历史记录将是:

a/ {Hello|Hi} {World|People}! {C{#|++|}|Java} is an {awesome|amazing} language.
b/ Hello {World|People}! {C{#|++|}|Java} is an {awesome|amazing} language.
c/ Hello World! {C{#|++|}|Java} is an {awesome|amazing} language.
d/ Hello World! {C#|Java} is an {awesome|amazing} language.
e/ Hello World! C# is an {awesome|amazing} language.
f/ Hello World! C# is an awesome language.

特别注意从(c)到(d)的过渡.因为我们正在寻找其中没有括号的第一个支撑部分,我们在{#|++|}之前做了{C{#|++|}|Java}.

现在您需要补充的是,你可以有可能性{,}或者|您的实际文本中-这些都需要以某种方式逃脱,以保护他们从修正引擎.


这是一个小C#程序,它显示了这一点.考虑到我对语言的相对缺乏经验,这可能不是那么令人印象深刻,但它说明了这个过程.

using System;
using System.Text.RegularExpressions;

namespace ConsoleApplication1
{
    class Program
    {
        static string spintax(Random rnd, string str) {
            // Loop over string until all patterns exhausted.
            string pattern = "{[^{}]*}";
            Match m = Regex.Match(str, pattern);
            while (m.Success) {
                // Get random choice and replace pattern match.
                string seg = str.Substring(m.Index + 1, m.Length - 2);
                string[] choices = seg.Split('|');
                str = str.Substring(0, m.Index) + choices[rnd.Next(choices.Length)] + str.Substring(m.Index + m.Length);
                m = Regex.Match(str, pattern);
            }

            // Return the modified string.
            return str;
        }

        static void Main(string[] args) {
            Random rnd = new Random();
            string str = "{Hello|Hi} {World|People}! {C{#|++|}|Java} is an {awesome|amazing} language.";
            Console.WriteLine(spintax(rnd, str));
            Console.ReadLine();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在一个示例中,输出是运行的

Hello World! C# is an awesome language.