4

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

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

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

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

我无法收集所需的逻辑。

4

2 回答 2

9

不用担心嵌套,只需迭代如下:

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

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

  3. 这是您修改后的字符串。

假设您有一个稍微有问题的随机数生成器,它总是返回零。您的字符串修改历史将是:

a/ {你好|嗨} {世界|人民}!{C{#|++|}|Java} 是一种{awesome|amazing} 语言。
b/你好{世界|人民}!{C{#|++|}|Java} 是一种{awesome|amazing} 语言。
c/世界你好!{C{#|++|}|Java} 是一种{awesome|amazing} 语言。
d/世界你好!{C#|Java} 是一种{awesome|amazing} 语言。
e/世界你好!C# 是一种{awesome|amazing} 语言。
f/世界你好!C# 是一门很棒的语言。

特别注意从 (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();
        }
    }
}

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

你好世界!C# 是一门很棒的语言。
于 2011-11-04T03:07:46.563 回答
2

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

于 2011-11-04T03:12:39.417 回答