【问题标题】:Perl regex word matchingPerl 正则表达式单词匹配
【发布时间】:2013-07-15 20:01:55
【问题描述】:

如何使用 perl 正则表达式匹配以下字符串?

$line="virtual void function";
$line="virtual function";
$line="void function";
$line="function";
$line="pure virtual function";
$line="extern function";
$line="extern void function";

即匹配 0 或 n 个函数限定符,由至少一个空格分隔,后跟字符串“function”。

不应该匹配

$line="// function";
$line="asdfgh";     
$line="endfunction";     

有没有类似的

$line=~/^([evp\s]*) function/ ;

哪个可以用于单词而不是字符?

【问题讨论】:

  • 也许:/^(\w+ ){0,2}function$//^((virtual|void|pure|extern) ){0,2}function$/

标签: regex perl regex-group


【解决方案1】:

(?:PAT1|PAT2) 是模式,就像[ab] 是字符。

/^(?:(?:extern|pure|virtual|void)\s+)*function/

【讨论】:

  • 可以简化为/^(?:extern|pure|virtual|void|\s*)*function/ 吗?
  • 不,这不等同。
  • /^(?:extern|pure|virtual|void|\s+|)+function/ 怎么样?
  • 更糟。仍然匹配externpurefunction,不再匹配function
  • 匹配function。但是是的,它也匹配externpurefunction
【解决方案2】:

我想出了一个看起来很像 ikegami 的解决方案:

#!/usr/bin/env perl
use strict;
use warnings;

my @lines = (
    "virtual void function",
    "virtual function",
    "void function",
    "function",
    "pure virtual function",
    "extern function",
    "extern void function",
    "// function",
    "asdfgh",
    "endfunction",
);

foreach my $line (@lines) {
    if ($line =~ m{^((virtual|void|pure|extern)\s+)*function}) {
        print "$line is a " . ($1||"'plain function'") . "\n";
    }
    else {
        print "ignored: $line\n";
    }
}

产生:

$ perl 17662838-perl-regex-word-matching.pl
virtual void function is a void
virtual function is a virtual
void function is a void
function is a 'plain function'
pure virtual function is a virtual
extern function is a extern
extern void function is a void
ignored: // function
ignored: asdfgh
ignored: endfunction

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多