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