哪个是用于数字和字符串的正确正则表达式?
Which is the right regular expression to use for Numbers and Strings?
我正在尝试创建简单的 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:对于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。整数颜色编码的正确表达式是什么?
下面是输出的屏幕截图:
提前感谢您的帮助!
试试:
\b\d+(\.\d+)?\b
用于 int、float 和 double,
"(?<=[{(,=\s+]+)".+?"(?=[,;)+ }]+)"
对于字符串,
对于字符串,这可能是最快的正则表达式 -
"\"[^\"\\]*(?:\\.[^\"\\]*)*\""
格式化:
" [^"\]*
(?: \ . [^"\]* )*
"
对于整数和小数,我所知道的唯一简单的表达式是
这 -
"(?:\d+(?:\.\d*)?|\.\d+)"
格式化:
(?:
\d+
(?: \. \d* )?
| \. \d+
)
附带说明,如果您从
开始就独立完成每个操作
您可能重叠的字符串突出显示。
匹配字符串忽略 \" 情况
".*?(?<!\)"
上面的代码一旦看到 "
就会开始匹配,并且会继续匹配任何内容,直到它到达下一个 "
之前没有 \
。这是使用 http://www.regular-expressions.info/lookaround.html
中解释得很好的后视功能实现的
- 匹配所有带小数点和不带小数点的数字
(\d+)(\.\d+)?
会给你至少一个数字后跟一个点和大于 1 的任意数量的其他数字。
字符串中匹配数字的问题可以通过两种方式实现:
a 修改上面的内容,使它们必须在两边都有空格 \W(\d+)(\.\d+)?\W
,我认为这在数学情况下(即 10+10)不会令人满意,或者在表达式的末尾(即 10;)。
b 将此作为优先事项。如果在数字之后检查字符串着色,则字符串的那部分将首先被着色为粉红色,但随后立即被红色覆盖。字符串着色优先。
对于整数去
(?<!(\^|\d|\.))[+-]?(\d+(\.\d+)?)(?!(x|\d|\.))
R1: 我相信对于正在进行的字符串中间的非转义 "
字符没有基于正则表达式的答案。您需要根据您的特定语法规则(您未指定)主动处理文本以消除或规避不匹配字符的误报。
但是:
如果你的意思是简单地忽略转义的,\"
,就像 java 那样,那么我相信你可以简单地将转义 + 引号对作为一个组包含在中心,而贪婪的 *
会处理剩下的事情:
\"((\\\")|[^\"])*\"
R2: 我相信以下正则表达式可用于查找整数和分数:
\d+(\.\d+)?
您也可以展开它来查找其他类型的数字。例如,\d+([\./]\d+)?
还会匹配数字,例如“1/4”。
我正在尝试创建简单的 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:对于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。整数颜色编码的正确表达式是什么?
下面是输出的屏幕截图:
提前感谢您的帮助!
试试:
\b\d+(\.\d+)?\b
用于 int、float 和 double,"(?<=[{(,=\s+]+)".+?"(?=[,;)+ }]+)"
对于字符串,
对于字符串,这可能是最快的正则表达式 -
"\"[^\"\\]*(?:\\.[^\"\\]*)*\""
格式化:
" [^"\]*
(?: \ . [^"\]* )*
"
对于整数和小数,我所知道的唯一简单的表达式是
这 -
"(?:\d+(?:\.\d*)?|\.\d+)"
格式化:
(?:
\d+
(?: \. \d* )?
| \. \d+
)
附带说明,如果您从
开始就独立完成每个操作
您可能重叠的字符串突出显示。
匹配字符串忽略 \" 情况
".*?(?<!\)"
上面的代码一旦看到 "
就会开始匹配,并且会继续匹配任何内容,直到它到达下一个 "
之前没有 \
。这是使用 http://www.regular-expressions.info/lookaround.html
- 匹配所有带小数点和不带小数点的数字
(\d+)(\.\d+)?
会给你至少一个数字后跟一个点和大于 1 的任意数量的其他数字。
字符串中匹配数字的问题可以通过两种方式实现:
a 修改上面的内容,使它们必须在两边都有空格
\W(\d+)(\.\d+)?\W
,我认为这在数学情况下(即 10+10)不会令人满意,或者在表达式的末尾(即 10;)。b 将此作为优先事项。如果在数字之后检查字符串着色,则字符串的那部分将首先被着色为粉红色,但随后立即被红色覆盖。字符串着色优先。
对于整数去
(?<!(\^|\d|\.))[+-]?(\d+(\.\d+)?)(?!(x|\d|\.))
R1: 我相信对于正在进行的字符串中间的非转义 "
字符没有基于正则表达式的答案。您需要根据您的特定语法规则(您未指定)主动处理文本以消除或规避不匹配字符的误报。
但是:
如果你的意思是简单地忽略转义的,\"
,就像 java 那样,那么我相信你可以简单地将转义 + 引号对作为一个组包含在中心,而贪婪的 *
会处理剩下的事情:
\"((\\\")|[^\"])*\"
R2: 我相信以下正则表达式可用于查找整数和分数:
\d+(\.\d+)?
您也可以展开它来查找其他类型的数字。例如,\d+([\./]\d+)?
还会匹配数字,例如“1/4”。