如何避免使用Java正则表达式预处理字符串文本中的注释

如何避免使用Java正则表达式预处理字符串文本中的注释,java,regex,string,comments,literals,Java,Regex,String,Comments,Literals,我正在为我这学期的课程编译器构建做一个小项目 我现在正在用Java语言为Java语言设计扫描仪部分。 此扫描程序将生成令牌,稍后将用于解析器 我所做的大部分工作都是使用Java正则表达式。 我目前面临的问题是,当我预处理代码以删除内联注释和多行注释时,它也会删除字符串文本中的注释(如果有)。 我正在使用以下正则表达式: String regExPreProcess = "((?s)(/\\*.*?\\*/|/\\*.*))|(//.*)" 有人能解释一下这个问题吗。我也尝试了lookahead

我正在为我这学期的课程编译器构建做一个小项目

我现在正在用Java语言为Java语言设计扫描仪部分。 此扫描程序将生成令牌,稍后将用于解析器

我所做的大部分工作都是使用Java正则表达式。 我目前面临的问题是,当我预处理代码以删除内联注释和多行注释时,它也会删除字符串文本中的注释(如果有)。 我正在使用以下正则表达式:

String regExPreProcess = "((?s)(/\\*.*?\\*/|/\\*.*))|(//.*)"

有人能解释一下这个问题吗。我也尝试了lookahead和lookahead功能,但问题仍然存在。

首先需要对内联和块(多行)注释进行正式定义

比如:

  • 内联注释以放置在字符串文本和块注释外部的内联注释delimeter(//)开始,并在行尾结束
  • 字符串文字以放置在内联或块注释外部的双引号(“)开始,以未转义的双引号(“)结束
  • 转义双引号是一个双引号,前面有奇数个反斜杠(\)
  • 块注释以放置在字符串文字和内联注释之外的注释开始,以注释结束,以注释结束,以delimeter(*/)

如您所见,这些定义中存在循环依赖关系。正则表达式不适合这个问题。您需要按顺序处理输入文本:检测开始标记并忽略所有内容,直到相应的结束标记

我甚至不确定正则表达式能不能做到…@路易斯是对的,正则表达式对此毫无用处。你不能只从中挑出你不感兴趣的部分,因为你不能在不了解整个上下文的情况下可靠地识别它们。你确定这就是你想要的吗?字符串文本中有注释意味着什么?你为什么会想要这些?@mvd:关键是:它们不是评论。我相信他想在开始“真正的”词法分析之前删除所有注释,但他知道字符串文字可能包含看起来像注释的内容,他想知道如何忽略它们。(如果我错了,请纠正我。)@Alan,是的,这就是我想做的。。。e、 g.如果存在类似“This is string//not a comment”或“This is string/*not a comment*/”的代码,则上述正则表达式不得删除以注释符号开头的字符串中的注释。