用PERL如何实现括号的正确匹配,相当于数学中的小括号,请多发表意见!!!
时间:2010-10-23
来源:互联网
如式子:
表达式1、{{名称为括号A ...}}......字符串{{......}};
A A B B
表达式2、{{...... .......{{...........}}...........}}
A B B A
其中A、B为正确匹配的括号名称,......为字符串,一段文字有很多表达示1和表达式2组成,用Perl 正则表达式如何实现括号({{)与回括号(}})AA、BB正确匹配呢?
如表达式1、用$kk =~ s/\{\{ ([^\}]+) \}\}/&Fuction($1)/gxe; 适合表达式1的情况但不适合表达式2的情况;
表达式2、用$kk =~ s/\{\{ (.*) \}\}/&Fuction($1)/gxe; 适合表达式2的情况但不适合表达式1的正确匹配;
与数学优先级高的小括号计算式表达式一样:
1、(2+3)×(4-8)
2、5×(3+8×(3+4))
不知道计算机或者计算器是如何正确匹配计算式小括号配对的???
请大家多给建议或意见!
谢谢大家了!
minirain
20101023
作者: minirain 发布时间: 2010-10-23
作者: zhlong8 发布时间: 2010-10-23
zhlong8 发表于 2010-10-23 22:45
请问如何实现呢?谢谢!
作者: minirain 发布时间: 2010-10-23
[new_current, [current, parent]],遇到 ')' 就消除一层……还要再具体吗
作者: zhlong8 发布时间: 2010-10-23
[ne ...
zhlong8 发表于 2010-10-23 22:53
能给个用PERL程序实现的例子,可以吗?
作者: minirain 发布时间: 2010-10-23
package T
- package T;
-
- use 5.012;
- use warnings;
-
- sub new {
- my($class, $parent) = @_;
- bless {
- current => [],
- parent => $parent
- }, $class;
- }
-
- sub dec {
- my $self = shift;
- push @{$self->{parent}{current}}, $self->{current};
- $self->{parent};
- }
-
- sub add {
- my($self, $val) = @_;
- push @{$self->{current}}, $val;
- }
-
- sub top {
- bless {current => [], parent=> []}, shift;
- }
-
- 1;
- use 5.012;
- use strict;
- use warnings;
- use T;
- use Data::Dumper;
- use Regexp::Common;
-
- sub parse {
- my $tree = T->top;
- for (@_) {
- given ($_) {
- when ('(') {$tree = T->new($tree)}
- when (')') {$tree = $tree->dec;}
- default {$tree->add($_);}
- }
- }
- say Dumper $tree;
- }
-
- sub tokenize { #功能非常有限
- my $str = shift;
- say "got $str";
- my @all;
- while ($str =~ /\G\s*(\(|\)|$RE{num}{int}|$RE{num}{real}|\w+|[+\-*\/])\s*/g) {
- push @all, $1;
- }
- say "return @all";
- @all;
- }
-
- #(define a (+ 343 (* 3323 a)))
- parse '(', 'define', 'a', '(', '+', '343', '(', '*', '3323', 'a', ')', ')', ')';
- #或者
- parse tokenize '(define a (+ 343 (* 3323 a)))'
- $VAR1 = bless( {
- 'parent' => [],
- 'current' => [
- [
- 'define',
- 'a',
- [
- '+',
- '343',
- [
- '*',
- '3323',
- 'a'
- ]
- ]
- ]
- ]
- }, 'T' );
还有 Regexp::Common::balanced
作者: zhlong8 发布时间: 2010-10-23
这个,单纯只用正则确实不容易啊,如果用堆栈的方式,可能会容易一些
作者: 珞水的大叔 发布时间: 2010-10-23
发现大叔太NB了,8月18到10月23总共65天在线855小时。
855/(65*24) = 54.81%
作者: zhlong8 发布时间: 2010-10-23
嘿嘿嘿嘿……
作者: 珞水的大叔 发布时间: 2010-10-23
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28