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

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

  • 字符串(“”)
  • 评论(//和/ * * /)
  • 关键词(公共,国际…)
  • 数字(像69这样的整数和1.5之类的浮点数)

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

经过大量测试,我已经完成了评论和关键词。

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

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内部。 哪个是用于整数颜色编码的正确表达式?

以下是输出的屏幕截图: 在此处输入图像描述

感谢您提前帮助!

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

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

格式:

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

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

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

格式:

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

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

试试:

  1. \\b\\d+(\\.\\d+)?\\b for int,float和double,
  2. "(?<=[{(,=\\s+]+)".+?"(?=[,;)+ }]+)"对于字符串,

对于整数去

 (? 
  1. 匹配一个字符串忽略\“情况

    ".*?(?

一旦看到"并且它将继续匹配任何东西,直到它到达下一个" ,上面将开始匹配,其前面没有\ 。 这是使用http://www.regular-expressions.info/lookaround.html上非常好解释的lookbehindfunction实现的

  1. 匹配所有带小数点和无小数点的数字

(\d+)(\.\d+)? 将为您提供至少一个数字,后跟一个点和大于1的任意数量的其他数字。

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

    • a修改上面的内容,以便它们必须存在于任何一侧的空格\W(\d+)(\.\d+)?\W ,我认为这在数学情况下不会令人满意(即10 + 10)或在表达式的末尾(即10;)。

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

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

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

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

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