6

我正在尝试创建简单的 IDE 并基于我的 JTextPane 着色

  • 字符串(“”)
  • 注释(// 和 /* */)
  • 关键字(公共,int ...)
  • 数字(69 等整数和 1.5 等浮点数)

我为源代码着色的方式是覆盖 StyledDocument 中的 insertString 和 removeString 方法。

经过多次测试,我完成了评论和关键字。

Q1:至于我的字符串着色,我根据这个正则表达式为我的字符串着色:

Pattern strings = Pattern.compile("\"[^\"]*\"");
Matcher matcherS = strings.matcher(text);

while (matcherS.find()) {
    setCharacterAttributes(matcherS.start(), matcherS.end() - matcherS.start(), red, false);
}

这在 99% 的情况下都有效,除非我的字符串包含特定类型的字符串,其中代码中有一个“\

Q2:对于整数和小数着色,根据这个正则表达式检测数字:

Pattern numbers = Pattern.compile("\\d+");
Matcher matcherN = numbers.matcher(text);
while (matcherN.find()) {
    setCharacterAttributes(matcherN.start(), matcherN.end() - matcherN.start(), magenta, false);
}

通过使用正则表达式“\d+”,我只处理整数而不是浮点数。此外,作为另一个字符串一部分的整数被匹配,这不是我在 IDE 中想要的。哪个是用于整数颜色编码的正确表达式?

下面是输出的截图: 在此处输入图像描述

感谢您提前提供任何帮助!

4

5 回答 5

3

对于字符串,这可能是最快的正则表达式 -

"\"[^\"\\\\]*(?:\\\\.[^\"\\\\]*)*\""

格式化:

 " [^"\\]* 
 (?: \\ . [^"\\]* )*
 "

对于整数和十进制数,我知道的唯一万无一失的表达式是
-

"(?:\\d+(?:\\.\\d*)?|\\.\\d+)"

格式化:

 (?:
      \d+ 
      (?: \. \d* )?
   |  \. \d+ 
 )

作为旁注,如果您从
字符串的开头独立地执行每个操作,您可能会重叠亮点。

于 2015-07-08T17:48:06.397 回答
2

尝试:

  1. \\b\\d+(\\.\\d+)?\\b对于 int、float 和 double,
  2. "(?<=[{(,=\\s+]+)".+?"(?=[,;)+ }]+)"对于字符串,
于 2015-07-08T17:34:10.853 回答
1
  1. 匹配忽略 \" 情况的字符串

    ".*?(?<!\\)"

上面的内容一旦看到 a 就会开始匹配",它将继续匹配任何内容,直到到达下一个"前面没有 a 的内容\这是通过使用http://www.regular-expressions.info/lookaround.html中很好解释的后向功能实现的

  1. 匹配所有带 & 不带小数点的数字

(\d+)(\.\d+)?会给你至少一个数字,后跟一个点和任何大于 1 的其他数字。

  1. 字符串中的数字匹配问题可以通过两种方式实现:

    • a 修改上面的内容,使它们必须在两边都存在空格\W(\d+)(\.\d+)?\W,我认为这在数学情况(即 10+10)或表达式末尾(即 10;)中不会令人满意。

    • b 将此作为优先事项。如果在数字之后检查字符串着色,则字符串的该部分将首先被着色为粉红色,但随后立即被红色覆盖。字符串着色优先。

于 2015-07-08T17:49:27.907 回答
1

对于整数去

(?<!(\\^|\\d|\\.))[+-]?(\\d+(\\.\\d+)?)(?!(x|\\d|\\.))
于 2015-07-08T17:51:14.533 回答
0

R1:"我相信对于正在进行的字符串中间的非转义字符没有基于正则表达式的答案。您需要根据您的特定语法规则(您未指定)主动处理文本以消除或规避不匹配字符的误报。

但是: 如果您的意思是像 java 那样简单地忽略转义的\",那么我相信您可以简单地将中心的转义+引号对作为一个组包含在内,而贪婪*将负责其余的工作: \"((\\\\\")|[^\"])*\"

R2:我相信以下正则表达式可用于查找整数和分数: \\d+(\.\\d+)?

您也可以扩展它以查找其他类型的数字。例如,\\d+([\./]\\d+)?, 将额外匹配像“1/4”这样的数字。

于 2015-07-08T18:04:24.263 回答