我正在尝试创建简单的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:对于整数和小数着色,基于此正则表达式检测数字:
Pattern numbers = Pattern.compile("\\d+");
Matcher matcherN = numbers.matcher(text);
while (matcherN.find()) {
setCharacterAttributes(matcherN.start(), matcherN.end() - matcherN.start(), magenta, false);
}
通过使用正则表达式" \ d +",我只处理整数而不是浮点数。此外,作为另一个字符串的一部分的整数是匹配的,这不是我想要的IDE内部。哪个是用于整数颜色编码的正确表达式?
以下是输出的屏幕截图:
提前感谢您的帮助!
答案 0 :(得分:3)
对于字符串,这可能是最快的正则表达式 -
"\"[^\"\\\\]*(?:\\\\.[^\"\\\\]*)*\""
格式化:
" [^"\\]*
(?: \\ . [^"\\]* )*
"
对于整数和十进制数,我所知道的唯一万无一失的表达是
这个 -
"(?:\\d+(?:\\.\\d*)?|\\.\\d+)"
格式化:
(?:
\d+
(?: \. \d* )?
| \. \d+
)
作为旁注,如果您从头开始独立完成各项工作 你可能重叠突出显示的字符串。
答案 1 :(得分:2)
尝试:
\\b\\d+(\\.\\d+)?\\b
表示int,float和double,"(?<=[{(,=\\s+]+)".+?"(?=[,;)+ }]+)"
for Strings,答案 2 :(得分:1)
匹配一个字符串,忽略\&#34;情况
".*?(?<!\\)"
以上内容会在看到"
后开始匹配,并且会继续匹配任何内容,直到它到达下一个"
之前没有\
的{{1}}。这是通过使用http://www.regular-expressions.info/lookaround.html
(\d+)(\.\d+)?
将为您提供至少一位数字,后跟一个点和任意数量的大于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”之类的数字。