Spintax允许您旋转各种单词和句子,例如:
{Hello|Hi} {World|People}! {C{#|++|}|Java} is an {awesome|amazing} language.
Run Code Online (Sandbox Code Playgroud)
大括号之间的文本将随机选择以形成不同的句子.
我自己可能想出一个解决方案,但我遇到的问题是嵌套.有时嵌套可能非常深.处理嵌套的可能解决方案是什么?
我无法收集所需的逻辑.
不要担心嵌套,只需按以下方式迭代执行:
找到字符串中{...}没有其他大括号的第一个序列.对于你的情况,那是{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();
}
}
}
Run Code Online (Sandbox Code Playgroud)
在一个示例中,输出是运行的
Hello World! C# is an awesome language.
| 归档时间: |
|
| 查看次数: |
2689 次 |
| 最近记录: |