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

Mat*_*ías 9 java regex

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

例:

test test test
test test test
test
test

[code]some
test
code
[/code]

more text
Run Code Online (Sandbox Code Playgroud)

应该:

test test test<br />
test test test<br />
test<br />
test<br />
<br />
[code]some
test
code
[/code]<br />
<br />
more text<br />
Run Code Online (Sandbox Code Playgroud)

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

str*_*ger 7

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

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 = "<br/>\n";
    }
}
Run Code Online (Sandbox Code Playgroud)


dmc*_*kee 6

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

您可能更好地使用基本的编译器构建技术(即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

到状态机.

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