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

时间:2011-11-04 03:03:24

标签: c# spintax

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

{Hello|Hi} {World|People}! {C{#|++|}|Java} is an {awesome|amazing} language.

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

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

我无法收集所需的逻辑。

2 个答案:

答案 0 :(得分:8)

不要担心嵌套,只需按照以下步骤进行迭代:

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

  2. 抓住所有可能性并选择一个随机的,用其值替换大括号部分。然后回到第1步。

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

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

    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();
            }
        }
    }
    

    在一个示例中输出

    Hello World! C# is an awesome language.
    

答案 1 :(得分:2)

我倾向于创建一个递归方法来处理解析。编写一个接受字符串的方法,扫描第一级括号,并从随附的选项中进行随机选择。然后,在将其插入最终结果之前,该方法将使用所选的选项字符串调用自身。