【问题标题】:C# and regex for word substitutions with nested tagsC# 和正则表达式用于嵌套标签的单词替换
【发布时间】:2010-10-12 14:59:49
【问题描述】:

我正在尝试创建一个小应用程序,它采用带有特殊标记的单词数组的基本文本模板,解析模板内容并输出随机生成的文本文档。

基本上,我想要做的是:

世界。

把它变成这样:

你好世界。 要么 你好世界。 要么 世界你好。

到目前为止,一切都很好。谷歌搜索让我能够成功地将 之间的内部文本提取到一个数组中,然后我从中随机选择一个单词来替换完整的 。

我遇到的问题是解析一组嵌套在相同标签中的单词。

例如,如果我从这个开始:

世界。 ?|你好吗?}>

我想把它变成这样:

你好世界。最近怎么样? 要么 你好世界。怎么样了? 要么 你好世界。你好吗?

等等……

有人可以建议一种使用 c# 和正则表达式相当简单地做到这一点的方法吗?

我查看了http://www.vsj.co.uk/articles/display.asp?id=789http://www.m-8.dk/resources/RegEx-balancing-group.aspx,老实说,其中很多都超出了我的想象,所以简单的东西会很好。 ;-)

谢谢。

【问题讨论】:

    标签: c# regex


    【解决方案1】:

    Visual Studio SDK 中有 lex 和 yacc:

    这些链接可能会有所帮助:

    http://msdn.microsoft.com/en-us/library/bb165963(VS.80).aspx

    http://devhawk.net/2006/09/17/Managed+Lex+And+Yacc.aspx

    取决于您的解析的复杂程度(考虑未来可能的更改和添加),但您可能只想坚持使用正则表达式。

    【讨论】:

      【解决方案2】:

      如果您当前有一个正则表达式可以正确地将标签内的值解析为一个数组(称为 A'),那么对于 A' 中的每个值,重新应用该正则表达式。

      您应该能够递归地执行此操作。

      【讨论】:

      • 不幸的是,上述语法不规则,因此您不能使用正则表达式。你需要产生式 S --> aBa,因此你需要一个上下文无关语言的解析器。
      • 我试过这个并让它工作。可能有更好的方法来做到这一点。诀窍是创建一个使用输入字符串和模式的类,找到一个匹配项并返回内部文本数组,使用字符串替换解析它并再次递归地将其传递给类,直到不再有正则表达式匹配。谢谢。跨度>
      【解决方案3】:

      这个问题不太适合正则表达式。识别您描述的表达式所需的语法不是regular grammar

      不过,上述表达式可以用context-free grammar 来描述。

      您应该能够使用LL(1) parser 有效地解析它。我想说这个问题更适合使用lex 对输入进行标记化并使用yacc 构造抽象语法树。

      这是Grammars and parsing with C#的教程

      【讨论】:

        【解决方案4】:

        您似乎在尝试描述和使用Context-Free Grammar 而不是正则表达式。

        上下文无关语法比正则表达式更强大:

        • 可以使用正则表达式生成的任何语言都可以通过上下文无关文法生成。
        • 有些语言可以由上下文无关文法生成,而不能由任何正则表达式生成。

        对于C#,我推荐你ANTLR,是一个语言识别框架,允许你从语法描述中构造识别器、解释器、编译器和翻译器。

        【讨论】:

          猜你喜欢
          • 2011-06-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多