匹配对称的括号
Matching Balanced Sets of
Parentheses
对称的圆括号、方括号之类的符号匹配起来非常麻烦。在处理配置文件和源代码时,经常需要匹配对称的括号。例如,解析C语言代码时可能需要处理某个函数的所有参数。函数的参数包含在函数名称之后的括号里,而这些参数本身又有可能包含嵌套的函数调用或是算式中的括号。我们先不考虑嵌套的括号,你或许会想到「\bfoo\([^])*\」,但这行不通。
秉承C的光荣传统,我把示范函数命名为foo。表达式中的标记部分是用来捕获参数的。对于foo(2,4.0)和foo(somevar,3.7)之类的参数,这个表达式完全没问题。但是,它也可以匹配foo(bar(somevar),3.7),这可不是我们需要的。所以要用到比「[^)]*」更聪明的办法。
为了匹配括号部分,我们可以尝试下面的这些正则表达式:
1. \(.*\) 括号及括号内部的任何字符。
2. \([^)]*\) 从一个开括号到最近的闭括号。
3. \([^()]*\)
从一个开括号到最近的闭括号,但是不容许其中包含开括号。
图5-1显示了对一行简单代码应用这些表达式的结果。
图5-1:三个表达式的匹配位置
我们看到,第一个正则表达式匹配的内容太多(注2),第二个正则表达式匹配的内容太少,第三个正则表达式无法匹配。孤立地看,第三个正则表达式能够匹配‘(this)’,但是因为表达式要求它必须紧接在foo之后,所以无法匹配。所以,这三个表达式都不合格。
真正的问题在于,大多数系统中,正则表达式无法匹配任意深度的嵌套结构。在很长的时间内,这是放之四海而皆准的规则,但是现在Perl、.NET和PCRE/PHP都提供了解决的办法(参见第328、436、475页)。但是,即使不用这些功能,我们也可以用正则表达式来匹配特定深度的嵌套括号,但不是任意深度的嵌套括号。处理单层嵌套的正则表达式是:
「\[^()]*(\([^()]*\)[^()]*)*\)」
这样类推下去,更深层次的嵌套就复杂得可怕。但是,下面的Perl程序,在指定嵌套深度$depth之后,生成的正则表达式可以匹配最大深度为$depth的嵌套括号。它使用的是Perl的“string
x count”运算符,这个运算符会把string重复count次:
$regex = '\('.'(?:[^()]|\(' x $depth .
'[^()]*' . '\))*' x $depth .'\)';
这个表达式留给读者分析。
分享到:
相关推荐
6. **取子匹配文本**:除了整个匹配外,正则表达式可能还包含捕获组,这些是用括号定义的子模式。`取子匹配文本`可以获取这些子模式的文本,这对于提取特定部分的文本非常有用。 7. **取子匹配数量**:这个方法返回...
一个好的正则表达式匹配调试工具可以帮助开发者快速定位问题,理解匹配规则,并优化正则表达式。这类工具通常提供以下功能: 1. **实时匹配测试**:用户输入正则表达式和目标字符串,工具会即时展示匹配结果,帮助...
在IT领域,正则表达式(Regular Expression,简称regex)是一种强大的文本处理工具,它能够进行复杂的模式匹配、查找、替换等操作。在本话题中,我们将探讨如何使用PowerBuilder 11.5这一经典的开发环境来实现正则...
在VB.NET中,正则表达式(Regular Expression)是一种强大的文本处理工具,它允许程序员通过模式匹配来处理字符串。这个“vb正则表达式实例”很可能是为了帮助开发者测试和理解正则表达式的工作原理而设计的一个应用...
在"C++ 正则表达式匹配工具源码"中,我们可以期待看到一系列类和函数,它们是基于`<regex>`库实现的,用于解析、编译和执行正则表达式。这些工具可能包括: 1. **正则表达式编译**:`std::regex`类用于创建一个正则...
1. **模糊查询**:通过正则表达式匹配相似的文本,如查询包含特定单词或短语的记录。 ```sql SELECT * FROM articles WHERE content REGEXP '.*example.*'; ``` 2. **格式验证**:确保输入的数据符合预期的格式,...
5. **捕获组**:提取匹配的子串,特别是对于包含括号的正则表达式,可以获取多个匹配部分。 6. **修饰符**:如全局匹配(g)使匹配不局限于第一个出现的位置,忽略大小写(i)等。 “pbregexp”组件可能提供了相应...
在"正则表达式匹配regex.rar"这个压缩包中,包含了以下几个关键文件,它们是理解和使用正则表达式的重要组成部分: 1. **XControl.dll**:这是一个动态链接库文件,可能包含了实现正则表达式匹配功能的函数和类。在...
正则表达式(Deelx版)是一种强大的文本处理工具,它允许程序员和用户通过预定义的模式来匹配、查找、替换或者分析字符串。Deelx版是专门为提高正则表达式性能和功能而设计的一个支持库,适用于各种编程语言和应用场景...
正则表达式匹配括号外的符号及数据,指的是从文本字符串中提取出所有位于圆括号“()”之外的字符、符号以及数据信息。 在给定的文件中提到的正则表达式`[\\?!/\\.,\\s]+(?=[^\\)]*(\\(|$))`解释如下: - `[\\?!/\\...
同时,正则表达式还提供了其他方式来匹配任意字符,例如使用字符集合([xxx])来匹配某些字符中的一个字符。 元字符和转义 在正则表达式中,元字符表示在正则表达式中不代表其字面含义,而是具有特别意义的字符。...
例如,对于小括号的匹配,可以构造如下的正则表达式: ``` \(([^()]|(?R))*\) ``` 这个表达式的含义是: - `\(`:匹配左括号; - `[^()]`:匹配除了括号之外的任何字符; - `(?R)`:递归匹配,即再次应用整个...
在“易语言模拟正则表达式匹配”这个主题中,我们主要关注的是如何在易语言环境中实现正则表达式的功能,这对于处理文本数据、进行模式匹配和搜索等任务非常有用。 正则表达式(Regular Expression)是一种强大的...
`group(0)`返回整个匹配的子串,`group(1)`返回第一个括号中的子表达式匹配的子串,以此类推。 - `start()`和`end()`: 分别返回匹配子串的起始和结束位置。 - `replaceAll()`: 使用正则表达式替换所有匹配的部分。 -...
1. **String.prototype.match()**:返回字符串中与正则表达式匹配的所有结果。 2. **String.prototype.search()**:返回匹配项的索引位置,如果没有找到则返回-1。 3. **String.prototype.replace()**:根据提供的...
正则表达式,简称为正则,是一种强大的文本处理工具,用于在字符串中进行模式匹配和搜索替换。在计算机科学和编程领域,正则表达式是处理文本的基础,广泛应用于数据验证、搜索、替换和提取等多种场景。下面将详细...
接着,定义了一个名为`SocialSecurityNumberValidator`的类,在主方法中使用`Pattern.compile`编译正则表达式,并使用`matcher.matches`来检查字符串是否与给定的模式匹配。 通过上述知识点的学习,读者可以了解到...
正则表达式(Regular Expression)是一种模式匹配工具,用于对字符串进行搜索、查找、替换等操作。在易语言中,正则表达式主要通过内置的函数和模块来实现。例如,"子程序_正则文本替换"可能就是一个易语言中用于...
正则表达式(Regular Expression,简称regex)是一种用于匹配字符串的强大工具,广泛应用于文本处理、数据验证、搜索和替换等场景。在编程语言中,正则表达式通常以字符串的形式存在,通过特定的语法和模式来定义...