哪个是用于数字和字符串的正确正则表达式?

时间:2015-07-08 17:14:29

标签: java regex jtextpane styleddocument

我正在尝试创建简单的IDE并根据

着色我的JTextPane
  • 字符串("")
  • 评论(//和/ * * /)
  • 关键字(public,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内部。哪个是用于整数颜色编码的正确表达式?

以下是输出的屏幕截图: enter image description here

提前感谢您的帮助!

5 个答案:

答案 0 :(得分:3)

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

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

格式化:

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

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

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

格式化:

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

作为旁注,如果您从头开始独立完成各项工作 你可能重叠突出显示的字符串。

答案 1 :(得分:2)

尝试:

  1. \\b\\d+(\\.\\d+)?\\b表示int,float和double,
  2. "(?<=[{(,=\\s+]+)".+?"(?=[,;)+ }]+)" for Strings,

答案 2 :(得分:1)

  1. 匹配一个字符串,忽略\&#34;情况

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

  2. 以上内容会在看到"后开始匹配,并且会继续匹配任何内容,直到它到达下一个"之前没有\的{​​{1}}。这是通过使用http://www.regular-expressions.info/lookaround.html

    中详细解释的lookbehind功能实现的
    1. 将所有数字与&amp;匹配没有小数点
    2. (\d+)(\.\d+)?将为您提供至少一位数字,后跟一个点和任意数量的大于1的其他数字。

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

        • a修改上述内容,以便它们必须存在\W(\d+)(\.\d+)?\W两侧的空格,我认为这在数学情境中(即10 + 10)或在表达式的结尾(即10;)。

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

答案 3 :(得分:1)

For Integer请使用

(?<!(\\^|\\d|\\.))[+-]?(\\d+(\\.\\d+)?)(?!(x|\\d|\\.))

答案 4 :(得分:0)

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

<强>然而 如果你的意思是简单地忽略转义的那些\",就像java一样,那么我相信你可以简单地在中心包含转义+引用对作为一个组,贪婪的*将照顾其余的部分: \"((\\\\\")|[^\"])*\"

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

您可以展开它以查找其他类型的数字。例如,\\d+([\./]\\d+)?还会匹配“1/4”之类的数字。