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

Which is the right regular expression to use for Numbers and Strings?

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

为我的 JTextPane 着色

我为源代码着色的方式是覆盖 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:对于Integers和Decimal coloring,数字是根据这个正则表达式检测的:

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

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

下面是输出的屏幕截图:

提前感谢您的帮助!

试试:

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

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

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

格式化:

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

对于整数和小数,我所知道的唯一简单的表达式是
这 -

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

格式化:

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

附带说明,如果您从
开始就独立完成每个操作 您可能重叠的字符串突出显示。

  1. 匹配字符串忽略 \" 情况

    ".*?(?<!\)"

上面的代码一旦看到 " 就会开始匹配,并且会继续匹配任何内容,直到它到达下一个 " 之前没有 \。这是使用 http://www.regular-expressions.info/lookaround.html

中解释得很好的后视功能实现的
  1. 匹配所有带小数点和不带小数点的数字

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

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

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

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

对于整数去

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

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

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

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

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