我正在研究Android(Editext)中的Java代码语法突出显示。
使用正则表达式突出显示关键字,文字,字符串,数字。
正则表达式用于突出显示字符串
字符串正则表达式:"\"(.*?)\"|'(.*?)'"
评论正则表达式:"/\\*(?:.|[\\n\\r])*?\\*/|//.*+\\/\\/.*"
正则表达式选择的顺序是关键词regex ........... string regex和last comment regex。
以上正则表达式正在正确选择普通字符串和注释,但是..
问题
双引号内的注释也会突出显示。 我想忽略双引号内的注释选择。
答案 0 :(得分:3)
对我而言,您似乎只是在搜索每个正则表达式的所有匹配项。如果正则表达式匹配,则为匹配着色。因此,您使用上一个匹配的颜色覆盖上一个匹配的颜色。
要解决此问题,您必须使用能够将给定输入文本转换为标记流的适当词法分析器。然后,您可以遍历令牌流,当遇到需要着色的令牌时,您可以执行此操作。
这可以防止当前问题,输入文本的一部分由多个正则表达式匹配,因此多次着色。它会阻止它,因为输入文本的每个字符只与令牌流中的一个标记相关联。
使用第一个最长匹配算法的词法分析器的工作方式如下:它搜索从输入文本开头开始的所有正则表达式匹配。它选择具有最长匹配的正则表达式。如果有多个共享最长匹配的正则表达式,则选择第一个。现在,词法分析器创建令牌流的第一个令牌。令牌由令牌类型(由正则表达式给出),匹配的起始位置和匹配的结束位置组成。接下来,词法分析器通过再次执行上述操作来搜索下一个标记。但是这一次,它会搜索从前一个令牌的结束位置开始的匹配。词法分析器执行此操作,直到完整的输入文本转换为令牌流,或直到遇到无效输入。
这里的重要部分是,令牌n
的结束位置和令牌n + 1
的起始位置是相同的。因此,没有重叠,因此总是只有一种颜色。