【问题标题】:Regex to detect comments/Strings without conflict, Method names, Class names正则表达式检测没有冲突的注释/字符串、方法名称、类名称
【发布时间】:2015-08-14 23:33:05
【问题描述】:

我正在创建一个简单的 IDE。

这是通过使用正则表达式检测代码类型并在 JTextPane 中为它们着色来完成的。

目前,我可以检测到:

  • 评论
  • 字符串字面量
  • 数字
  • 关键/受限字词

下面是我的程序示例:

问题 1:我的正则表达式检测字符串文字,然后检测 cmets。因此,它会覆盖它的颜色,导致字符串中的 cmets 被错误地着色。

这是用于检测 cmets 的正则表达式:

Pattern commentsSingle = Pattern.compile("\\/\\/.*");
Pattern commentsMulti = Pattern.compile("\\/\\*.*?\\*\\/", Pattern.DOTALL);

这是用于检测字符串文字的正则表达式:

Pattern strings = Pattern.compile("((?<!\\\\)\\\"(.*?)\\\"(?<!\\\\\\\"))");

有没有办法让我的 cmets 正则表达式无法检测到字符串文字(" " 双引号)

或许

无法在 cmets 中检测到的字符串

问题 2:我希望检测方法名称(用户创建的)并将它们着色为不同的颜色。

是否有可以检测方法名称的正则表达式?

问题 3:就像 Q2 一样,我希望检测类名并将它们着色为不同的颜色。

是否有可以检测类名的正则表达式?

--

对不起,我对正则表达式比较陌生,非常感谢任何帮助。

【问题讨论】:

  • 你显然没有考虑清楚你的逻辑。
  • @PM 77-1 你的意思是我不应该检测 cmets,然后是字符串并覆盖它的颜色?还是我的正则表达式逻辑不正确?
  • 专业提示: 斜线 (/) 和引号 (") 在正则表达式中都没有任何特殊含义。引号需要用 one 反斜杠转义,因为它在字符串文字中,而斜杠不需要任何。

标签: java regex string methods comments


【解决方案1】:

专业提示:你做错了。

编程语言中有太多复杂的结构无法用正则表达式来解释。即使语言相当简单,您的正则表达式也会很快变得难以维护和更新。不仅如此,正则表达式也很快开始在大型数据集上运行缓慢。

您最好的选择是Lexing/Parsing

您将能够非常快速地标记代码部分,并且还能够支持多种语言。

【讨论】:

  • 我知道我不应该使用正则表达式来做所有事情,但这只是我个人的简单项目,我正在学习正则表达式..我只需要一些帮助来修复我的正则表达式以检测非常简单的代码
  • @user3188291 问题是您想要检测除了上下文之外几乎无法区分的方法名称和类名称。正则表达式和上下文不能很好地相互配合,你将很难让它发挥作用。老实说,我认为这是不可能的。此外,实现一个词法分析器并不困难,而且只需要很少的时间。假设您有该语言的语法,解析器只需要多做一点工作。
  • 哦,好吧..如果 qn 2 和 qn 3 无法解决,我理解。感谢您的反馈.. 但我的小项目的主要目的是理解和学习如何使用正则表达式。我不想使用其他方法谢谢
【解决方案2】:

iismathwizard 是正确的,解析器会更好,但我认为作为一个正则表达式练习,这是个好主意。但是你可以试试这个:

  • 方法:[\w$]+(?=\([^)]*\)\s*\{)DEMO
  • Java 类:(?&lt;=class\s{0,1000})([\w$]+)(?=(?:\s*(?:implements|extends)\s*(?:[\w$]+))?\s*\{) 已修改 DEMO
  • cmets,按类型分组:^(?:\s*?)(?:[^"\n\r]*?(?:"[^"]+?")?[^"\n\r]*?)?(?:(?&lt;endOfLine&gt;//[^\n]*)|(?&lt;javadoc&gt;/\*\*(?:.|\n)+?(?=\*/)\*/)|(?&lt;block&gt;/\*(?:.|\n)+?(?=\*/)\*/))DEMO

实际上,我宁愿把这个问题分成 3 个单独的问题,有人会花一些时间来回答一个问题,那就是 3 更合理。

【讨论】:

  • 感谢您的反馈.. 下次我会尝试将问题分成 3 个问题!我已经在 regex101 中测试了这两个正则表达式,但它不起作用..但我仍然感谢你的帮助。谢谢!
  • 如果正则表达式有效,您能告诉我如何检查 regex101 吗?会更容易找到解决方案。 DEMO 类,DEMO 方法
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-01-08
  • 1970-01-01
  • 2011-03-12
  • 2020-07-24
  • 2010-09-21
相关资源
最近更新 更多