C#如何在字符串中使用语句来解析文本

时间:2015-01-17 19:43:29

标签: c# regex parsing

我已经在基于文本的游戏上工作了一段时间,而我遇到的一个问题是当我必须根据可能在整个游戏中发生变化的变量编写不同的段落时。

我已经四处寻找解析器,但主要是找到正则表达式,我认为这在这里很有用。我正在寻找的是一种查看这样的字符串的方法。

String x = "'It's nice to meet you [if (Female){ "Miss, what's a pretty young thing like you doing out in the dessert."} else { "Sir, what can I do for ya?"}]' the man asks in a drawl.";

我目前必须编写用if语句分解的段落,但是编写它需要花费更长的时间,并且更难以保持对话流程。我的目标是有一个我可以发送字符串的类,并在执行时根据整个游戏中变化的变量返回格式化版本。

4 个答案:

答案 0 :(得分:0)

有几种方法可以实现您的目标,但这是一种方法。有一个课程,根据性别为每个对话生成答案:

class CharacterResponses
{
    private bool _isFemale;

    new CharacterResponses(bool isFemale)
    {
        _isFemale = isFemale;
    }

    public string GetResponse1()
    {
        return _isFemale
            ? "Miss, what's a pretty young thing like you doing out in the dessert."
            : "Sir, what can I do for ya?";
    }

    public string GetResponse2() // For a different conversation.
    // etc...
}

现在,在你的程序中,你可以有这样的流程:

var character = new CharacterResponses(true); // Female.
var x = string.Format("It's nice to meet you {0} the man asks in a drawl.", character.GetResponse1());

这会将字符性别中的所有if - then逻辑保留在其自己的代码块中,并允许您轻松地将占位符放入主对话中。

答案 1 :(得分:0)

如果您有大量文本和许多可能的变体,我建议您编写一些代码,为您生成字符串。无论如何,将它们混合在源代码中似乎并不是很好(imho)。

一些xml怎么样?

<Message Key="message123">
    <Text>It's nice to meet you </Text>
    <Switch Field="Gender">
        <Female>
            Miss, what's a pretty young thing like you
            doing out in the dessert?
        </Female>
        <Male>Sir, what can I do for ya?</Male>
    </Switch>
    <Text> the man asks in a drawl</Text>
</Message>

<If>语句和其他内容输入一些代码,您将拥有很大的灵活性。即基于其他变量的不同文本,例如健康或库存项目。

对你的问题不是一个真正的答案,但我认为我还要加两分钱。

答案 2 :(得分:0)

编写类StringInterpolated(名称并不重要),用于插入字符串(以您的格式)。唯一的缺点是你必须在最后添加参数 - 在你的例子中Female

根据您的需要,您可以抛出任何语法来插入所需的字符串,您也可以添加一个检查是否所有带有值的参数都被传递,因此这一方面将被覆盖。

答案 3 :(得分:-1)

如果这是你的目标,那么c#真的不适合你。它根本不提供此功能,而will offer string interpolation in version 6.0,我怀疑它是否会支持您想要的完整语句。这种功能根本不是语言的目标,实际上会使主要目标之一(一流的工具支持)变得更加困难。

一个有趣的替代方案可能是编写在powershell中进行插值的代码,动态的supports full string interpolation,自Windows XP 3开始安装在每台Windows机器上,并与任何.Net语言进行原生互操作。

您甚至可以通过calling powershell for just that one component将您的其余代码放在c#中来实现此目的。

由于ifs的powershell语法看起来与c#非常相似,因此您的代码可能类似于

interpolate(@"'It's nice to meet you $(if (Female){ ""Miss, what's a pretty 
young thing like you doing out in the dessert.""} else { ""Sir, what can I 
do for ya?""})' the man asks in a drawl.");

话虽这么说,但这并非超级简单,但如果从c#代码文件进行字符串插值是必须的,那么它可能是你最好的选择。

其他替代方案:

  • 同样的事情,但使用支持插值而不是Powershell的任何其他.Net语言
  • 将您的字符串写为Razor模板,并使用RazorEngine进行编译
  • 使用即将推出的Roslyn编译器中的功能将字符串编译为c#。

这些东西都不容易,但一切都可行。