我需要帮助来替换
字符串中的所有\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
谢谢你的时间.最好的祝福.
我会建议一个(简单的)解析器,而不是正则表达式.像这样的东西(糟糕的伪代码):
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"; } }
你已经标记了正则表达式的问题,但这可能不是这项工作的最佳工具.
您可能更好地使用基本的编译器构建技术(即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
到状态机.
适用于机器生成的词法分析器和解析器的通常参数适用.