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