English 中文(简体)
我怎么能够与Perl特定模式相对应的插图相匹配?
原标题:How can I match strings that don t match a particular pattern in Perl?
  • 时间:2010-01-21 11:51:10
  •  标签:
  • regex
  • perl

我知道,除了使用定期表达的某种特性外,很容易与任何东西相匹配。

$text = "ab ac ad";
$text =~ s/[^c]*//g; # Match anything, except c.

$text is now "c".

我不知道如何用“例外”代替特征。 除“......”外,我怎么会“做任何事情? Tried [^(ac)]和[^”c]都没有成功。

完全有可能?

问题回答

下面回答Bart K.评论中第二句话所理解的问题:

>> $text= ab ac ad ;
>> $text =~ s/(ac)|./1/g;
>> print $text;
ac

此外, abacadac -> acac

应当指出的是,在大多数实际应用中,负面的头盔证明比这种办法更有用。

如果你只想检查一下,扼杀是否含有“ac”,就只能使用否定。

$text = "ab ac ad";

print "ac not found" if $text !~ /ac/;

print "ac not found" unless $text =~ /ac/;
$text =~ s/[^c]*//g; // Match anything, except c.

@ssn, A couple of comments about your question:

  1. "//" is not a comment in Perl. Only "#" is.
  2. "[^c]*" - there is no need for the "*" there. "[^c]" means the character class composed of all characters except the letter "c". Then you use the /g modifier, meaning all such occurrences in the text will be replaced (in your example, with nothing). The "zero or more" ("*") modifier is therefore redundant.

How would I "match anything, except ac " ? Tried [^(ac)] and [^"ac"] without success.

请阅读关于品级的文件(见“perldoc perlre”,载于您的指挥线,或在线http://perldoc.perl.org/perlre.html)-请参看:对于方括号内的特性清单,Re将“从名单上删除任何特性”。 定购单并不相关,没有“指示”,只有一份特性清单:“()”和双重报价在方括号内也没有特别意义。

现在我不确切地确定,为什么你重新谈论配对,而是举出替代的例子。 但是,看看看看看看看看看看看看看看看看看看看看上去的“ac”是否与你刚才需要否定的匹配:

use strict; use warnings;
my $text = "ab ac ad";
if ($text !~ m/ac/) {
   print "Yey the text doesn t match  ac !
"; # this shouldn t be printed
}

你们有一系列案文,其中含有多个次体的发生。 如果你只想围绕次指示的案文,就只删除次指示的所有发生:

$text =~ s/ac//g;

如果你想要相反的话——除次指示的所有发生情况外,删除所有案文,我建议:

use strict; use warnings;
my $text = "ab ac ad ac ae";
my $sub_str = "ac";
my @captured = $text =~ m/($sub_str)/g;
my $num = scalar @captured;
print (($sub_str x $num) . "
");

这基本上算出在案文中次指示数的几倍,并用“x”操作器打印次数。 我不敢说谎,我敢肯定的是,能够找到更好的东西。


http://www.un.org。

my $text = "ab ac ad";
$text !~ s/(ac)//g; # Match anything, except ac.

这是不正确的,因为它在“使用警告”下产生了警告(“在无效的情况下不使用具有约束力的消极模式”(!~),而且除了删除案文中所有“ac”的字句外,没有做任何事情。

$text =~ s/ac//g;

<>Update: 在对你的提问发表评论时,你提到你想要清理离心标记,删除<条码>{>......<条码>>>。 Perl FAQ第6节涉及这一点:

考虑以下方案:

#! /usr/bin/perl

use warnings;
use strict;

use Text::Balanced qw/ extract_tagged /;

# for demo only
*ARGV = *DATA;

while (<>) {
  if (s/^(.+?)(?={{)//) {
    print $1;
    my(undef,$after) = extract_tagged $_, "{{" => "}}";

    if (defined $after) {
      $_ = $after;
      redo;
    }
  }

  print;
}

__DATA__
Lorem ipsum dolor sit amet, consectetur
adipiscing elit. {{delete me}} Sed quis
nulla ut dolor {{me too}} fringilla
mollis {{ quis {{ ac }} erat.

其产出:

Lorem ipsum dolor sit amet, consectetur
adipiscing elit.  Sed quis
nulla ut dolor  fringilla
mollis {{ quis  erat.

具体事例是,你可以使用

$text =~ s/[^ac]|a(?!c)|(?<!a)c//g;

仅删除<代码>a或c。 当它们是<代码>ac序列的序号。

总的来说,这是经常表达的骗局。

页: 1 随后是<条码>,<条码>。 往往比较清楚,更容易单独检查。 例如:

die "invalid string ($str)"
  if $str =~ /^.*foos*bar/;

页: 1 回答类似问题,我在会上写道

my $nofoo = qr/
  (      [^f] |
    f  (?! o) |
    fo (?! o  s* bar)
  )*
/x;

my $pattern = qr/^ $nofoo bar /x;

为了解这一复杂情况,将How Regexes Work改为Mark Dominus。 该发动机将定期表述汇编成国家机器。 当时间相匹配时,它为国家机器提供素材,并检查国家机器是否在接收国完成。 为了排除指示,你必须指定一个机器,接收除特定顺序外的所有投入。

什么可能帮助是<代码>/v的常规表述转换,这种转换会像往常一样创建国家机器,然后补充所有国家的接受状态。 很难说,与单独检查相比,这是否真正有用,因为“<代码>/v的定期表述可能仍然使人感到惊讶,就像以不同的方式。

如果你对理论细节感兴趣,见。 Peter Linz介绍正式语言和自主语言。

您可使用指数

$text = "ab ac ad";
print "ac not found" if ( index($text,"ac") == -1 );

为您的目的,你可以轻松地修改这一规定。

use Test::More 0.88;

#Match any whole text that does not contain a string
my $re=qr/^(?:(?!ac).)*$/;
my $str= ab ac ad ;

ok(!$str=~$re);

$str= ab af ad ;
ok($str=~$re);

done_testing();




相关问题
Why does my chdir to a filehandle not work in Perl?

When I try a "chdir" with a filehandle as argument, "chdir" returns 0 and a pwd returns still the same directory. Should that be so? I tried this, because in the documentation to chdir I found: "...

How do I use GetOptions to get the default argument?

I ve read the doc for GetOptions but I can t seem to find what I need... (maybe I am blind) What I want to do is to parse command line like this myperlscript.pl -mode [sth] [inputfile] I can use ...

Object-Oriented Perl constructor syntax and named parameters

I m a little confused about what is going on in Perl constructors. I found these two examples perldoc perlbot. package Foo; #In Perl, the constructor is just a subroutine called new. sub new { #I ...

Where can I find object-oriented Perl tutorials? [closed]

A Google search yields a number of results - but which ones are the best? The Perl site appears to contain two - perlboot and perltoot. I m reading these now, but what else is out there? Note: I ve ...

热门标签