【问题标题】:Unable to maintain code structure when removing comments [duplicate]删除评论时无法维护代码结构[重复]
【发布时间】: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 是不可能的。你需要一个更复杂的解析器来保存一些状态/状态机

标签: java regex scala comments


【解决方案1】:

我在这里及时成为第一个发布此著名问题链接的人: RegEx match open tags except XHTML self-contained tags

一个严肃的答案是

我认为这里的缺陷在于 HTML 是 Chomsky Type 2 语法 (上下文无关语法)和 RegEx 是 Chomsky Type 3 语法(正则 语法)。因为类型 2 语法基本上比 类型 3 语法(参见乔姆斯基层次结构),它在数学上是 用 RegEx 解析 XML 是不可能的。

Java cmets 的标准也不是上下文无关文法。所以所有关于解析 html 的内容都适用于这里。

【讨论】:

  • 请注意,正则表达式不是正则表达式。大多数正则表达式引擎都具有允许它们解析非常规语言的功能。但是,确切地通常从未记录或调查过哪些语言。但是,例如,我相信 Ruby 的 Regexp 可以解析所有上下文无关的、几乎所有(或什至所有)上下文相关的语言,甚至可能是一些 Type0 语言。例如,它们具有(命名的)递归,这通常是证明图灵完备性使用的那些东西之一。 Perl 正则表达式可以检查素数!
  • 谢谢,但我想看看是否有人可以帮助我真正解决这个问题。事实证明,我不得不从头开始编写一个完全自定义的代码,避免使用正则表达式,并使用模式匹配来解决它。
  • 你可以尝试在IntelliJ的源代码中找到他们做的地方。
猜你喜欢
  • 2010-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-07
  • 2020-01-12
  • 1970-01-01
相关资源
最近更新 更多