`
chikaiwang
  • 浏览: 2754 次
  • 性别: Icon_minigender_1
最近访客 更多访客>>
社区版块
存档分类
最新评论

是正则表达式还是ANTLR的用武之地?

阅读更多
有这么一个字符串:a1=1,a2=X2{b1=1,b2=X3{c1=1,c2=2}},a3=X4{b1=1}
想写一个正则表达式,让下面code的执行结果是:
result(以逗号为token来分割字符串,逗号在"{"和"}"里面的忽略其做为token):
a1=1
a2=X2{b1=1,b2=X3{c1=1,c2=2}}
a3=X4{b1=1}


code:
Pattern p1 = Pattern.compile("(?<=^|,)(?:[^,{]++(?:\\{[^{}]*+(?:\\{[^{}]++\\})*+\\})*+)*+(?=,|$)");
Matcher m1 = p1.matcher("a1=1,a2=X2{b1=1,b2=X3{c1=1,c2=2}},a3=X4{b1=1}");
  while( m1.find() )
  {
      String foundstring = m1.group();
      System.out.println("foundstring:" + foundstring);
  }

用正则表达式实现上面需求确实比较无奈,还是要动用到ANTLR定义自己的语言规则比较好?
分享到:
评论
4 楼 歆渊 2007-04-20  
如果格式是逗号和{}这些固定的, 自己写个解析程序很简单的, 效率又不知高多少倍.
3 楼 chikaiwang 2007-04-20  
Pattern p1 = Pattern.compile("(?<=^|,)(?:[^,{]++(?:\\{[^{}]*+(?:\\{[^{}]++\\})*+\\})*+)*+(?=,|$)");


  上面的表达式满足我的结果,也就是只支持{}的一层嵌套,如果想满足二层嵌套,就必须写两倍长度于上面的正则表达式。正则表达式处理这种递归确实是个弱项。

2 楼 hbcui1984 2007-04-20  
个人感觉用antlr比较好,但是项目中很少用到,没仔细看过
1 楼 chikaiwang 2007-04-20  
郁闷,原来Java不支持正则表达式的无限递归匹配。

相关推荐

    regexp-vm:使用虚拟机方法实现正则表达式匹配

    使用VM方法进行正则表达式匹配正则表达式匹配模拟 java.util.regex 的 API 的... 该实现的灵感来自 Russ Cox 的文章“Regular Expression Matching: The Virtual Machine Approach”,并利用 Antlr4 来解析正则表达式。

    Regex.zip 如何在C#中構建正則表達式引擎

    状态机是正则表达式引擎的核心,它用于执行模式匹配。每个正则表达式操作对应于状态机中的一个状态或转换。 4. **C#中的正则表达式类库** .NET Framework提供了一个内置的正则表达式类库,名为`System.Text....

    Antlr入门介绍小demo

    什么是 ANTLR? ANTLR 是一个功能强大的解析器生成器,能够读取、处理、执行或翻译结构化的文本或二进制文件。ANTLR 包括词法分析工具和语法分析工具,最初由 PayPal 捐赠,后由 PCCTS 演化。ANTLR 广泛应用于 ...

    用Antlr 分析布尔表达式的例子

    用antlr分析处理布尔表达式的例子,包括:语法定义.g文件;生成的词法分析和语法分析器;带有图形界面的分析器调用代码。 其中带有GUI的分析器ParserFrame,可以用于任何.g文件生成的词法、语法分析器,只要通过改变...

    基于ANTLR的信号表达式解析

    在本文中,ANTLR被用于实现对信号表达式的解析功能,增加了表达式的形式,并允许在表达式中使用变量,进而计算出变量在某个区间内的表达式值。 在计算机处理信号的过程中,通常分为两种途径:一种是直接通过设备...

    JFLex用户手册中文版.PDF

    它生成一个程序(lexer),该程序读取输入,将输入与spec文件中的正则表达式匹配,并在正则表达式匹配的情况下运行相应的操作。lexer通常是编译器中的第一个前端步骤,用于匹配关键字、注释、操作符等,并为解析器生成...

    词法分析器的自动生成识别单词的DFA自动构造.rar_beingnlc_closeroyi_dfa生成_zeroplc_自动生成

    在这个过程中,词法分析器通常会根据预定义的规则,即正则表达式,来识别源代码中的关键字、标识符、常量、运算符等。在给定的标题和描述中,我们看到" DFA自动构造 "和" 自动生成 "这两个关键概念,这表明我们讨论...

    编译原理实验 分析表达式

    在编译原理中,表达式分析是编译器前端的重要组成部分,主要负责将源代码中的数学或逻辑表达式转换成中间表示(如抽象语法树AST)。这个实验旨在让你理解和掌握如何设计并实现一个简单的表达式解析器。在这个过程中...

    编译原理词法分析器的构造

    词法分析器的构造是编译器设计与实现的重要组成部分,涉及到了状态转移、正则表达式等多个概念。 1. **词法分析器的作用** 词法分析器的作用是将源代码中的字符流转化为符号流,这个过程包括识别关键字、标识符、...

    CMM词法分析器 使用java语言实现

    在Java中,我们可以使用正则表达式或者第三方库如ANTLR、JFlex等来实现词法分析器。 首先,我们需要理解CMM语言的词汇规则。这包括识别CMM语句中的各种符号、关键字、标识符、数字、字符串等。例如,关键字可能是...

    java实现词法分析器

    词法分析器读取源代码文件,并根据预定义的规则(通常是正则表达式)匹配字符序列,这些序列被称为模式。例如,数字模式、标识符模式、运算符模式等。当匹配成功时,词法分析器会返回一个表示该模式的词法单元,通常...

    词法分析器 LEX

    在LEX文件中,每个正则表达式对应一个动作,当匹配到该正则表达式时,就会执行相应的C函数。这些动作可以是输出符号、改变状态、或者调用其他函数。例如,我们可以定义一个正则表达式来匹配数字,当LEX遇到连续的...

    antlr-2.7.7.jar

    ANTLR使用正则表达式定义词法规则,并通过上下文无关文法(Context-Free Grammar, CFG)来描述语法规则。这些规则在ANTLR的配置文件(通常以.g或.gram为扩展名)中定义。 ANTLR-2.7.7.jar 是ANTLR 2.7.7版本的Java...

    统计你的项目中所有java文件中有效代码量,注解量及空行数

    为了提高效率和准确性,你还可以考虑优化正则表达式,或者使用Java的`JavaCC`或`ANTLR`等解析库来解析Java源代码,这样可以更准确地识别代码结构,避免误判。同时,对于大型项目,处理大量文件时,可以考虑多线程...

    编译原理 词法分析java版

    例如,Java的关键字可以通过一个正则表达式集合来识别,而数字和字符串常量则有各自的正则表达式。 词法分析的过程通常包括以下步骤: 1. **输入源代码**:读取源代码文件,通常以字符流的形式。 2. **分词**:...

    词法分析器(java实现)

    首先,词法分析器的基本原理是通过正则表达式或者状态机模型识别源代码中的关键字、标识符、常量、运算符等元素。Java中没有内置的词法分析工具,但我们可以利用Java的强大库如JavaCC、ANTLR等第三方框架,或者直接...

    Antlr4 C++ 计算器

    在本项目中,"Antlr4 C++ 计算器"是一个基于ANTLR4库实现的计算器应用,主要目标是解析并执行简单的数学表达式。 ANTLR4工作流程主要包括以下几个步骤: 1. **语法定义**:首先,你需要为你的语言编写一个语法规则...

    过滤Java多行注释

    1. **正则表达式方法**: 可以尝试使用如下的正则表达式来匹配并替换多行注释: ```regex /\/\*[^*]*\*+([^/*][^*]*\*+)*\// ``` 但请注意,这个正则表达式不能处理嵌套的多行注释,如`/* 这是一个 /* 嵌套的 */ ...

    基于antlr的java解释器

    词法分析器通常会使用正则表达式来识别这些元素。 3. **语法分析**:接着,ANTLR生成的解析器(Parser)将标记流转换为抽象语法树(AST)。AST是一种数据结构,直观地表示了程序的结构,方便后续的解释和执行。 4....

    java编写 c语言词法分析器

    1. **正则表达式**:词法分析器通常使用正则表达式来定义不同类型的标记。例如,C语言中的数字可以表示为一个正则表达式,用于匹配所有有效的数字序列。 2. **Java的正则库**:Java提供了`java.util.regex`包,包含...

Global site tag (gtag.js) - Google Analytics