首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >匹配perl变量的Regex

匹配perl变量的Regex
EN

Stack Overflow用户
提问于 2012-09-15 21:11:14
回答 3查看 1.9K关注 0票数 2

我目前正在学习正则表达式,并试图创建一个正则表达式来匹配Perl中的任何合法变量名。

,这就是我到目前为止写的:

代码语言:javascript
复制
^\$[A-Za-z_][a-zA-Z0-9_]*

唯一的问题是正则表达式返回特殊符号的true,例如字符串$a&将返回true。

我做错了什么?

谢谢!图腾

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-09-15 21:15:19

最后您需要一个$,否则它只是尽可能地匹配,而忽略了其余的。所以应该是:

代码语言:javascript
复制
^\$[A-Za-z_][A-Za-z0-9]*$
票数 2
EN

Stack Overflow用户

发布于 2012-09-15 21:30:06

解析Perl是很困难的,什么是变量和不是变量的规则是复杂的。如果您试图解析Perl,请考虑使用PPI。它可以解析Perl程序并执行类似于查找所有变量的操作。PPI是评审员用来做它的工作的。

如果你想试着做这件事,以下是一些需要考虑的边缘案例.

代码语言:javascript
复制
$^F
$/
${^ENCODING}
$1
$élite           # with utf8 on
${foo}
*{foo} = \42;
*{$name} = \42;  # with strict off
${$name} = 42;   # with strict off

当然还有其他的西格尔斯@%*。并检测某物是否在一个单引号内。这是我强烈鼓励你使用PPI而不是自己尝试的方式。

如果你想练习,实际的练习是从一个更大的字符串中提取变量,而不是做精确的匹配。

代码语言:javascript
复制
# Match the various sigils.
my $sigils         = qr{ [\$\@\%*] }x;

# Match $1 and @1 and so on
my $digit_var      = qr{ $sigils \d+ }x;

# Match normal variables
my $named_var      = qr{ $sigils [\w^0-9] \w* }x;

# Combine all the various variable matches
my $match_variable = qr{ ( $named_var | $digit_var ) }x;

这使用()捕获操作符只获取变量。它还使用/x修饰符使正则表达式更容易阅读,并使用替代分隔符来避免倾斜牙签综合征。使用\w而不是A-Z可以确保在utf8打开的时候,utf8字符会被拾取,而关闭的时候不会。最后,使用qr来构建正则表达式。填补空白是一项练习。

票数 8
EN

Stack Overflow用户

发布于 2016-02-09 00:33:48

我需要解决这个问题来创建一个简单的源代码分析器。

此子例程从代码的输入部分提取Perl用户变量。

代码语言:javascript
复制
sub extractVars {
    my $line = shift;
    chomp $line;
    $line =~ s/#.*//;       # Remove comments
    $line =~ s/\s*;\s*$//;  # Remove trailing ;
    my @vars = ();
    my $match = 'junk';
    while ($match ne '') {
        push @vars, $match if $match ne 'junk';
        $match = ''; 
        if ($line =~ s/(
                [\@\$\%]            # $@%
                {?                  # optional brace
                \$?                 # optional $
                [\w^0-9]            # begin var name
                [\w\-\>\${}\[\]'"]* # var name
                [\w}\]]             # end var name
                |
                [\@\$\%]            # $@%
                {?                  # optional brace
                \$?                 # optional $
                [\w^0-9]            # one letter var name
                [}\]]?              # optional brace or bracket
                )//x) {
            $match = $1;
            next;
        }
    }
    return @vars;
}

用以下代码测试它:

my @variables = extractVars('$a $a{b} $a[c] $scalar @list %hash $list[0][1] $list[-1] $hash{foo}{bar} $aref->{foo} $href->{foo}->{bar} @$aref %$hash_ref %{$aref->{foo}} $hash{\'foo\'} "$a" "$var{abc}"');

如果变量名包含空格,则不起作用,例如:

  • $hash{"baz qux"}
  • ${ $var->{foo} }[0]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12442623

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档