【发布时间】:2019-10-05 21:31:57
【问题描述】:
我正在尝试替换各种 cmets(单行、内联和多行)。当 // 和 /* */ 没有出现在任何类型的引号之间时,初始正则表达式工作得非常好,"" 或 """""" 。当我稍微修改正则表达式以处理和排除引号之间的 // 的出现时,它的失败和初始代码结构也混乱了。
这是我最初的正则表达式 (Regex:1):(?:/\\*(?:[^*]|(?:\\*+[^*/]))*\\*+/)|(?://.*)
这是我调整的正则表达式以尝试处理引号内的单行 cmets (Regex:2):(?:/\\*(?:[^*]|(?:\\*+[^*/]))*\\*+/)|[^\"](?://.*)[^\"]
考虑这个示例数据:
// Comment 1
/* Multiline comments
ends here */ Some text
Random statement // something else
import something..
import something else /* few random stuff
that goes on */ /* Lets try this again */
Text to show
val tryThis = " something // else "
val tryAgain = "12345"
val again = " /* kskokds // */ "
Regex:1 的实际结果 =>
Some text
Random statement
import something..
import something else
Text to show
val tryThis = " something
val tryAgain = "12345"
val again = " "
Regex:2 的实际结果 =>
// Comment 1
Some text
Random statementimport something..
import something else
Text to show
val tryThis = " somethingval tryAgain = "12345"
val again = " "
预期结果 =>
Some text
Random statement
import something..
import something else
Text to show
val tryThis = " something // else "
val tryAgain = "12345"
val again = " /* kskokds // */ "
【问题讨论】:
-
我认为用正则表达式解析 cmets 是不可能的。你需要一个更复杂的解析器来保存一些状态/状态机