Java 变量的正则表达式模式

Java 变量的正则表达式模式,java,regex,Java,Regex,我需要一个覆盖以下所有场景的变量的通用正则表达式模式: 最终类型变量_name=value,b=value;//最后一个字符串a=“Hi” 类型变量_name=value,b;//字符a='c' 变量\u name=值;//a=假 键入变量_name;//INTA 变量名不能以数字开头,如果以u开头,后面必须有另一个字母 我的正则表达式分别为: “(最终)\s+”+保留的\u类型\u关键字 +“\s+(“+变量名称+”\s+=\s+”+值+“|”+变量名称+”+”+;” “(“+保留类型\关键字

我需要一个覆盖以下所有场景的变量的通用正则表达式模式:

  • 最终类型变量_name=value,b=value;//最后一个字符串a=“Hi”
  • 类型变量_name=value,b;//字符a='c'
  • 变量\u name=值;//a=假
  • 键入变量_name;//INTA 变量名不能以数字开头,如果以u开头,后面必须有另一个字母

    我的正则表达式分别为:

  • “(最终)\s+”+保留的\u类型\u关键字 +“\s+(“+变量名称+”\s+=\s+”+值+“|”+变量名称+”+”+;”

  • “(“+保留类型\关键字+变量\名称+”(\s+=\s+“+值+”;“+变量\名称+”)?+”

  • “(“+变量名称+”\s+=\s+“+值+”|“+变量名称+”+”)+;”

  • 保留类型关键字+“\s+”+变量名称+“+”;”

    reserved_TYPE_关键字=“(int | double | boolean | char | String)”

    变量_NAME=“({1}\w+)|([a-zA-Z]{1}\w*)”

    值=布尔+字符+字符串

    布尔=“(假|真)”+“|”+双精度

    DOUBLE=“(“+INT+”\.“+INT+”)”+“|“+”(“+INT+”)”

    INT=“([-]?[1-9]\d*| 0)”


  • 提前谢谢

    实际答案由Maciej Kozieja给出:
    不要尝试正则表达式,使用由标记器提供的语法树

    我只是添加了一些推理(顺便提一下,引自聊天),
    为了帮助您了解原因:

    请理解,您似乎正在尝试的(查找编程语言语法的某些部分)是我已经尝试过的(尽管使用C)。
    它不仅仅只适用于正则表达式。 您需要应用各种上下文知识。
    这将得到一个语法树。
    为了提供语法树,实际上不可避免的方法是标记器

    另一方面,我不像人们公认的那样讽刺。
    如果您获得了所有占位符的正则表达式,您可能可以自己覆盖可变场景。
    查找那些正则表达式(我承认是这样假设的)需要与语法树相关联的上下文感知

    但是,如果您只解析非常重复的代码,而且一直都非常相似,那么您可能会做出许多假设,从而允许您实际处理正则表达式。
    (我也这样做过——甚至成功了。但我应该提到,我是在经历了多次痛苦的“哦,我忘了那个特例”之后才成功的。如果我不得不再次做同样的工作,我可能会从标记器提要语法树开始。或者通过我最喜欢的搜索引擎为我寻找这样做的东西。) 然而,对于这一点,了解所有可能的输入是非常重要的,要想在这里找到解决方案,您必须提供所有的示例输入

    这种情况(基于许多假设的正则表达式)也包含在为占位符提供正则表达式的过程中,因为这定义了允许的灵活性范围。
    然而,从一个被这些假设烧坏的人到一个可能会烧坏的人:你真的必须在你的样本输入中考虑所有的可能性。

    涵盖了以下所有内容。
    我只看到一种情况,即,变量_name的正则表达式这是一个场景,但其他事情是可选的。您正在寻找标记器并创建语法树,而不是正则表达式。不,我要的是一个正则表达式,它将捕获好的,我印象深刻。然后显示正则表达式。提供示例输入和所需输出,您可能得到的解决方案将仅涵盖您提供的示例输入。您很快就会注意到,您没有想到所有需要的示例输入。灵活的解决方案。。。见Maciej的评论。