正则表达式 - 不要在双引号内选择注释

时间:2016-08-07 20:37:07

标签: java android regex android-edittext

我正在研究Android(Editext)中的Java代码语法突出显示。

使用正则表达式突出显示关键字,文字,字符串,数字。

正则表达式用于突出显示字符串 字符串正则表达式:"\"(.*?)\"|'(.*?)'"

评论正则表达式:"/\\*(?:.|[\\n\\r])*?\\*/|//.*+\\/\\/.*"

正则表达式选择的顺序是关键词regex ........... string regex和last comment regex。

以上正则表达式正在正确选择普通字符串和注释,但是..

问题

双引号内的注释也会突出显示。 我想忽略双引号内的注释选择。

请仔细阅读图片以更好地了解问题(预期输出) 任何帮助或指导都将受到赞赏enter image description here

1 个答案:

答案 0 :(得分:3)

对我而言,您似乎只是在搜索每个正则表达式的所有匹配项。如果正则表达式匹配,则为匹配着色。因此,您使用上一个匹配的颜色覆盖上一个匹配的颜色。

要解决此问题,您必须使用能够将给定输入文本转换为标记流的适当词法分析器。然后,您可以遍历令牌流,当遇到需要着色的令牌时,您可以执行此操作。

这可以防止当前问题,输入文本的一部分由多个正则表达式匹配,因此多次着色。它会阻止它,因为输入文本的每个字符只与令牌流中的一个标记相关联。

使用第一个最长匹配算法的词法分析器的工作方式如下:它搜索从输入文本开头开始的所有正则表达式匹配。它选择具有最长匹配的正则表达式。如果有多个共享最长匹配的正则表达式,则选择第一个。现在,词法分析器创建令牌流的第一个令牌。令牌由令牌类型(由正则表达式给出),匹配的起始位置和匹配的结束位置组成。接下来,词法分析器通过再次执行上述操作来搜索下一个标记。但是这一次,它会搜索从前一个令牌的结束位置开始的匹配。词法分析器执行此操作,直到完整的输入文本转换为令牌流,或直到遇到无效输入。

这里的重要部分是,令牌n的结束位置和令牌n + 1的起始位置是相同的。因此,没有重叠,因此总是只有一种颜色。