Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex perl-将子字符串提取到计数为零或更多的字符_Regex_String_Perl - Fatal编程技术网

Regex perl-将子字符串提取到计数为零或更多的字符

Regex perl-将子字符串提取到计数为零或更多的字符,regex,string,perl,Regex,String,Perl,我在一个文件中有以下字符串 1. aaa bbb zccc ddd eee; 2. yyaaa bbb zccc dzdd eee; ('z' is present multiple times) 3. yyaaa bbb ccc *zddd eee; (special character '*' present) 4. yyaaa bbb ccc * zddd eee; (special character '*' present) 5. aaa bbb ccc* zddd eee;

我在一个文件中有以下字符串

1. aaa bbb zccc ddd eee; 
2. yyaaa bbb zccc dzdd eee;  ('z' is present multiple times)
3. yyaaa bbb ccc *zddd eee;  (special character '*' present)
4. yyaaa bbb ccc * zddd eee; (special character '*' present)
5. aaa bbb ccc* zddd eee;    (special character '*' present)
6. aaa bbb ccc ddd eee;      ('z' is absent)
另一个示例文件

1. aaa bbb zccc ddd eee; 
2. yyaaa bbb zccc dzdd eee;
3. yyaaa bbb *ccc * zddd eee;
4. yyaaa bbb * ccc zddd eee;
5. aaa bbb* ccc zddd eee;
6. aaa bbb ccc ddd eee;
在每一行中,我想从
aaa
的末尾提取子字符串,直到
z
(减去
z
)。如果缺少
z
,则应打印整个字符串。如果有特殊字符,则应省略它们

所需输出

bbb
bbb
bbb ccc
bbb ccc
bbb ccc
aaa bbb ccc ddd eee
我已经尝试了以下方法,但没有给出我想要的结果

my $file = qq(test.txt);
open (my $IN, '<', $file) || die "Cannot open $file for read: $!";     
my @lines=<$IN>;  
close($IN);

foreach (@lines)
{
    if( $_ =~ m/aaa\b(.*?)z/)
    {
        print "$1\n";
    } 
}

我不确定如何排除特殊字符(已尝试的字符类),并且在第6行没有“z”字符的情况下,它不会输出任何内容。

您可以将否定字符类用作

if( $_ =~ m/aaa\b([^z;]*)/)
{
    $string = $1;
    $string =~ s/\*//g;
    print "$string\n";
}
# Outputs
# bbb
# bbb
# bbb ccc
# bbb ccc
# bbb ccc
# bbb ccc ddd eee
  • [^z;]*
    匹配除
    z
    以外的任何内容
  • $string=~s/\*//g将组中的
    *
    替换为空

    • 我想这就是你想要的

      请注意,无法在单个捕获中排除“特殊”字符,因此必须分两个阶段完成

      您的“必需输出”比相应的输入行具有更少的空格,但是您在文本中没有提到任何关于这一点的内容,因此无法知道您真正想要的是什么

      使用严格;
      使用“全部”警告;
      而(){
      下一步除非/a++\s+((?:(!\s*z)。+)/;
      (my$val=$1)=~tr/*;///d;
      打印$val,“\n”;
      }
      __资料__
      1.aaa bbb zccc ddd eee;
      2.yyaaa bbb zccc dzdd eee;
      3.yyaaa bbb*ccc*zddd eee;
      4.yyaaa bbb*ccc zddd eee;
      5.aaa bbb*ccc zddd eee;
      6.aaa bbb ccc ddd eee;
      
      输出
      bbb
      bbb
      bbb-ccc
      bbb-ccc
      bbb-ccc
      bbb ccc ddd eee
      
      如果($=~m/aaa\b([^z*]*)/)可能
      ?你能澄清一下规则吗?定义“特殊字符”。它只是
      *
      还是有其他的?就这个问题而言,它只是
      *
      它对
      1之类的东西不起作用。aaa bbb zccc ddd eee;2.yyaaa bbb zccc dzdd eee;3.yyaaa bbb*ccc*zddd eee;4.yyaaa bbb*ccc zddd eee;5.aaa bbb*ccc zddd eee;6.aaa bbb ccc ddd eee
      @ontherocks如果
      *
      可能发生在
      a
      z
      之间,则我们必须将其替换为null以删除它们。我已经编辑了我的答案,希望如此helps@ontherocks很高兴听到它起作用了。我不知道为什么有两个人选择投反对票。我们能去掉输出最后一行的分号吗?@ontherocks:Done。您确实需要学习准确地指定您的需求。让那些免费帮助你的人一次又一次地添加“还有一件事”是不公平的。太棒了!谢谢你能解释一下用于提取的嵌套分组吗?@ontherocks:鉴于我最后一句关于“还有一件事”的评论,这是非常讽刺的
      if( $_ =~ m/aaa\b([^z;]*)/)
      {
          $string = $1;
          $string =~ s/\*//g;
          print "$string\n";
      }
      # Outputs
      # bbb
      # bbb
      # bbb ccc
      # bbb ccc
      # bbb ccc
      # bbb ccc ddd eee