哪个是用于数字和字符串的正确正则表达式?
我正在尝试创建简单的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+ )
作为旁注,如果你从一开始就独立完成
你可能重叠突出显示的字符串。
试试:
-
\\b\\d+(\\.\\d+)?\\b
for int,float和double, -
"(?<=[{(,=\\s+]+)".+?"(?=[,;)+ }]+)"
对于字符串,
对于整数去
(?
-
匹配一个字符串忽略\“情况
".*?(?
一旦看到"
并且它将继续匹配任何东西,直到它到达下一个"
,上面将开始匹配,其前面没有\
。 这是使用http://www.regular-expressions.info/lookaround.html上非常好解释的lookbehindfunction实现的
- 匹配所有带小数点和无小数点的数字
(\d+)(\.\d+)?
将为您提供至少一个数字,后跟一个点和大于1的任意数量的其他数字。
-
在字符串内匹配数字的问题可以通过两种方式实现:
-
a修改上面的内容,以便它们必须存在于任何一侧的空格
\W(\d+)(\.\d+)?\W
,我认为这在数学情况下不会令人满意(即10 + 10)或在表达式的末尾(即10;)。 -
b将此作为优先事项。 如果在数字后检查字符串着色,则字符串的该部分将首先变为粉红色,然后立即用红色覆盖。 字符串着色优先。
-
R1:我相信对于正在进行的字符串中间的非转义"
字符"
没有基于正则表达式的答案。您需要主动处理文本以消除或规避不应该是字符的字符的误报。匹配,基于您的特定语法规则(您未指定)。
但是:如果你的意思是简单地忽略转义的那些, \"
就像java一样,那么我相信你可以简单地在中心包含转义+引用对作为一个组,而贪婪的*
会处理其余的: \"((\\\\\")|[^\"])*\"
R2:我相信以下正则表达式可用于查找整数和分数: \\d+(\.\\d+)?
您可以将其展开以查找其他类型的数字。 例如, \\d+([\./]\\d+)?
,还会匹配像“1/4”这样的数字。