`
tanbamboo
  • 浏览: 19314 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

一个Regex错误导致的问题,郁闷。

阅读更多
最近有个项目,被老板追的很紧,结果我在代码重构(用Regex优雅的替换了一些方法)后,由于测试不充分,结果现场出现一个问题。

正解: ([^\$\{\}]*)\$(\{([\w\d]*)\}|([\d]+))
误写为: ([^\$\{\}]*)\$(\{([\w\d]*)\}|([\d+]))
结果group 4总是只能取第一个数字,立刻想到了Java最长匹配、最短匹配的问题,google了n久没有结果,实在受不了,压力之下,有了以下的代码片段:
			int begin = 0;
			int pos1 = -1;
			int pos2 = -1;
			int pos3 = -1;
			int pos4 = -1;
			int pos5 = -1;
			for(int i = 0; i < format.length(); i++) {
				char c = format.charAt(i);
				if(c == '$') {
					pos1 = i;
				}
				if(pos1 != -1 && c == '{') {
					pos2 = i;
				}
				if(pos2 != -1 && c == '}') {
					pos3 = i;
					prefixAndProperties.add(new PrefixAndProperty(pos1 > begin?format.substring(begin, pos1):"", format.substring(pos2 + 1, pos3), null));
					begin = i + 1;
					pos1 = pos2 = pos3 = -1;
				}
				if(pos1 != -1 && pos4 == -1 && c >= '0' && c <= '9') {
					pos4 = i;
				}
				if(pos4 != -1 && (c < '0' || c > '9')) {
					pos5 = i;
					prefixAndProperties.add(new PrefixAndProperty(pos1 > begin?format.substring(begin, pos1):"", null, format.substring(pos4, pos5))); 
					begin = i;
					pos1 = pos4 = pos5 = -1;
				}
			}
			if(pos1 != -1 && pos4 != -1) {
				prefixAndProperties.add(new PrefixAndProperty(pos1 > begin?format.substring(begin, pos1):"", null, format.substring(pos4))); 
			} else {
				if(begin < format.length()) {
					suffix = format.substring(begin);
				}
			}

最后和另一个同事讨论了一下,居然发现是+写到了[]里面,
分享到:
评论

相关推荐

    正则表达式(regex)错误使用导致功能漏洞分析

    另一个常见的错误是在使用方括号“[]”进行字符集匹配时出现的。在方括号内,大多数元字符将失去它们的特殊意义,变成普通字符,除非它们被转义或在方括号中有特殊含义。方括号中的特殊字符只有“^”、“-”和“\”...

    regex.h regex.cpp

    最后,压缩包中的`regex.c`文件可能是另一个C语言的源文件,它可能包含了一些使用`regex.h`中函数的实际示例代码,展示如何在C语言项目中集成和使用正则表达式功能。 总结起来,这个文件组合提供了在Linux下使用...

    TestRegex_regex_C#_

    "TestRegex_regex_C#" 这个标题表明我们有一个简单的应用,其目的是测试C#中字符串与正则表达式的匹配。 描述中提到“Simple application for test string regex”,这暗示该程序可能包含一个用户界面,允许用户...

    正则表达式测试工具regex101

    `regex101`是一个在线的正则表达式测试工具,它允许用户编写、测试和调试他们的正则表达式,以确保它们能够正确地匹配所需的数据。 `regex101`具有以下主要特点: 1. **实时测试**:用户可以在界面上输入正则...

    GNU regex 正则表达式 修正版

    总的来说,GNU regex修正版是一个旨在提供更稳定、更高效、更易于移植的正则表达式库。对于依赖正则表达式的开发者来说,这是一个值得信赖的选择,尤其是那些需要在不同操作系统上部署其应用的开发者。通过深入理解...

    Regex Tester

    在.NET框架下,Regex Tester是一个实用的工具,它可以帮助开发者测试和验证自己的正则表达式,确保它们能按照预期工作。下面将详细介绍Regex Tester以及与之相关的正则表达式知识。 1. **Regex Tester的用途** - *...

    正则表达式工具RegexTester

    RegexTester这样的工具能够极大地提高工作效率,减少因正则表达式错误导致的问题。 通过RegexTester,你可以逐步构建复杂的正则表达式,测试不同的部分,理解它们如何工作,以及如何组合这些部分来达到预期的效果。...

    Cpp regex usge demo

    在C++中,`std::regex`是一个基本的正则表达式对象,你可以通过构造函数传递一个字符串来创建它,该字符串表示你要匹配的模式。例如,如果你想匹配所有数字,可以这样做: ```cpp std::regex numberRegex("\\d+"); ...

    RegexTester.exe

    同时,了解如何在RegexTester.exe这样的工具中有效地利用这些特性,能够帮助开发者避免因正则表达式错误导致的程序问题。 总之,RegexTester.exe是正则表达式开发者的得力助手,它的运行离不开.NET Framework 4.0的...

    linux下的C语言POSIX正则表达式头文件和源文件: regex.h regex.cpp

    总之,POSIX正则表达式是C语言编程中的一个重要工具,无论在Linux还是Windows环境下,都可以通过`regex.h`头文件提供的API实现强大的文本匹配功能。了解和掌握这些函数的使用方法,对于提升C/C++程序的文本处理能力...

    C++正则表达式-regex类(不依赖其他库)

    这个压缩包文件包含了一个名为`regex.h`的头文件,以及`release`和`debug`两个目录,这通常意味着它提供了编译好的库文件,供不同构建配置(发布模式和调试模式)使用。 `regex`类的核心功能包括: 1. **构造与...

    boost regex 检测 数学公式

    在IT领域,Boost库是一个非常重要的C++工具集,它为开发者提供了许多高效且功能强大的组件,其中之一就是Boost.Regex库。Boost.Regex是用于处理正则表达式的库,它支持高级的匹配模式和字符串搜索操作。在本场景中,...

    RegexTester

    9. **错误和警告**:当正则表达式有误或不完整时,RegexTester会给出相应的错误提示,帮助用户快速定位问题。 通过RegexTester这样的工具,用户可以在实际应用前对正则表达式进行充分的测试和优化,从而提高代码...

    regex match tracer

    为此,"Regex Match Tracer"应运而生,这是一个专门用于调试正则表达式的工具,旨在帮助用户直观地理解正则表达式的匹配过程。 ### 1. 正则表达式基础 正则表达式由一系列字符和特殊符号组成,用于定义一个字符串...

    RegEx TestBed

    `RegEx TestBed` 是一个专为 .NET 平台设计的正则表达式测试工具,它提供了直观的界面和丰富的功能,帮助开发者测试、调试和优化他们的正则表达式。 在 .NET Framework 和 .NET Core 中,正则表达式的实现位于 `...

    GNU regex windows编译

    这个压缩包文件似乎包含了一个针对Windows环境的GNU regex编译版本,名为"regex2dll",它可能是一个动态链接库(DLL),方便开发者在Windows平台上集成到自己的项目中使用。 在Windows上编译GNU regex库通常涉及到...

    Linux下regex移植,Linux和windows可通用

    在IT行业中,正则表达式(Regex)是一...最后,压缩包中的`c++regex`可能是一个示例或者库,用于演示或提供C++标准库的regex功能。在具体使用时,需要结合实际情况,参考其提供的文档和示例代码,以适应你的项目需求。

    正则校验工具 RegexTester

    通过这个工具,开发者可以高效地调试和优化正则表达式,提高代码质量,减少因正则表达式错误导致的问题。 总之,`RegexTester`是一个实用的工具,对于学习和使用正则表达式的人来说,它是一个不可或缺的助手,可以...

    Regex Match Tracer 正则表达式 测试工具

    5. **插件支持**:stdplgin.dll可能是一个插件库文件,为Regex Match Tracer提供额外的功能或扩展。 6. **可执行文件**:MTracer.exe是Regex Match Tracer的主程序,负责运行和管理整个工具。 7. **卸载链接**:...

    boost.regex

    使用Boost.Regex,首先需要包含`&lt;boost/regex.hpp&gt;`头文件,并创建一个`boost::regex`对象。例如: ```cpp #include &lt;boost/regex.hpp&gt; #include int main() { boost::regex pattern(R"(\d+)"); std::...

Global site tag (gtag.js) - Google Analytics