Spintax C#…我该如何处理?

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

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

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

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

我无法收集所需的逻辑。

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

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

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

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

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

 a / {Hello | Hi} {World | People}!  {C {#| ++ |} | Java}是一种{awesome | amazing}语言。
 b / Hello {World | People}!  {C {#| ++ |} | Java}是一种{awesome | amazing}语言。
 c / Hello World!  {C {#| ++ |} | Java}是一种{awesome | amazing}语言。
 d / Hello World!  {C#| Java}是一种{awesome | amazing}语言。
 e / Hello World!  C#是一种{awesome | amazing}语言。
 f / Hello World!  C#是一种很棒的语言。

特别注意从(c)到(d)的过渡。 因为我们正在寻找其中没有括号的第一个支撑部分,所以我们在{C{#|++|}|Java}之前执行{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#是一种很棒的语言。

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

Interesting Posts