Spintax 允许您旋转各种单词和句子,例如:
{Hello|Hi} {World|People}! {C{#|++|}|Java} is an {awesome|amazing} language.
大括号之间的文本将被随机选择以形成不同的句子。
我自己可能想出一个解决方案,但我遇到的问题是嵌套。有时嵌套可能很深。处理嵌套的可能解决方案是什么?
我无法收集所需的逻辑。
不用担心嵌套,只需迭代如下:
查找字符串中{...}
没有其他大括号的第一个序列。对于您的情况,就是{Hello|Hi}
. 如果不再有该模式,请转到步骤 3。
抓住所有可能性并随机选择一个,用它的值替换大括号部分。然后返回步骤 1。
这是您修改后的字符串。
假设您有一个稍微有问题的随机数生成器,它总是返回零。您的字符串修改历史将是:
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# 是一门很棒的语言。
我倾向于创建一个递归方法来处理解析。编写一个方法,该方法接受一个字符串,扫描第一级大括号,并从包含的选项中进行随机选择。然后,该方法将使用选定的选项字符串调用自身,然后将其插入最终结果。