当前位置:  开发笔记 > 编程语言 > 正文

正则表达式替换字符串中的所有\n,但不包括[code] [/ code]标记内的所有\n

如何解决《正则表达式替换字符串中的所有\n,但不包括[code][/code]标记内的所有\n》经验,为你挑选了2个好方法。

我需要帮助来替换
字符串中的所有\n(新行)字符,而不是[code] [/ code]标记内的那些字符.我的大脑正在燃烧,我无法用自己解决这个问题:(

例:

test test test
test test test
test
test

[code]some
test
code
[/code]

more text

应该:

test test test
test test test
test
test

[code]some test code [/code]

more text

谢谢你的时间.最好的祝福.



1> strager..:

我会建议一个(简单的)解析器,而不是正则表达式.像这样的东西(糟糕的伪代码):

stack elementStack;

foreach(char in string) {
    if(string-from-char == "[code]") {
        elementStack.push("code");
        string-from-char = "";
    }

    if(string-from-char == "[/code]") {
        elementStack.popTo("code");
        string-from-char = "";
    }

    if(char == "\n" && !elementStack.contains("code")) {
        char = "
\n"; } }



2> dmckee..:

你已经标记了正则表达式的问题,但这可能不是这项工作的最佳工具.

您可能更好地使用基本的编译器构建技术(即lexer提供简单的状态机解析器).

你的词法分析器会识别五个标记:("[code]","\n","[/ code]",EOF,:所有其他字符串:)和你的状态机看起来像:

state    token    action
------------------------
begin    :none:   --> out
out      [code]   OUTPUT(token), --> in
out      \n       OUTPUT(break), OUTPUT(token)
out      *        OUTPUT(token)
in       [/code]  OUTPUT(token), --> out
in       *        OUTPUT(token)
*        EOF      --> end

编辑:我看到其他海报讨论嵌套块的可能需要.这个状态机不会处理它.对于嵌套块,使用递归的正确解析器(不是那么简单但仍然足够容易和可扩展).

编辑:Axeman指出,这种设计不允许在代码中使用"[/ code]".可以使用逃逸机制来击败它.像添加'\'到你的标记并添加:

state    token    action
------------------------
in       \        -->esc-in
esc-in   *        OUTPUT(token), -->in
out      \        -->esc-out
esc-out  *        OUTPUT(token), -->out

到状态机.

适用于机器生成的词法分析器和解析器的通常参数适用.

推荐阅读
罗文彬2502852027
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有