java - 正则表达式 - 不要选择双引号内的评论

标签 java android regex android-edittext

我正在研究 Android (Edittext) 中的 Java 代码语法高亮显示。

使用正则表达式来突出关键字、文字、字符串、数字。

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

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

正则表达式选择顺序是关键字正则表达式............字符串正则表达式和最后评论正则表达式。

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

问题是

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

请浏览图像以更好地理解问题(预期输出) 任何人的帮助或指导将不胜感激enter image description here

最佳答案

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

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

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


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

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

关于java - 正则表达式 - 不要选择双引号内的评论,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38818314/

相关文章:

java - OS X 上的 SWT : menu without window

java - Android:接口(interface)与 get 方法

javascript - 过滤 <td> 元素中带有空格的匹配文本

regex - 使用 Dart 链接 HTML 文本

regex - 处理 SPARQL-Filter 表达式中的特殊字符

c# - 无法为 java 和 c# (winrt) 获得相同的 hmac_sha1 结果

java - 如何改进这段代码?

java - glReadPixels 返回错误值

android - 如何使用 pidcat?

android - 丑陋的 9-patch ,不正确缩放