regex - 需要帮助使用 Perl 修复此正则表达式代码吗?

标签 regex string perl

我需要您的专业帮助来使用 Perl 修复此正则表达式代码?

我有这个数据文件...

__Data__
SCSI - test-A
ccccccccccccccccc
aaaaaaaaaaaaaaaaa
bbbbbbbbbbbbbbbbb

__Data__
SCSI - test-B
ccccccccccccccccc
aaaaaaaaaaaaaaaaa
bbbbbbbbbbbbbbbbb

__Data__
SCSI - test-C
ccccccccccccccccc
aaaaaaaaaaaaaaaaa
bbbbbbbbbbbbbbbbb

I would like the following output

__Data__
SCSI - test-A

__Data__
SCSI - test-B

__Data__
SCSI - test-C

Instead, I'm getting this output which is missing the __Data__ for two of the data records.

__Data__
SCSI - test-A
SCSI - test-B
SCSI - test-C

Here the code..

$/ = "__Data__"; # setting the input separator variable to __Data__

while(<ReadFile>)
{
   $_ =~ s/(SCSI.*test-(A|B|C)?)(.*)/$1/ms;
   print $_;
}

最佳答案

你告诉 Perl 该行以 __DATA__ 结尾,所以你得到了

1: "__Data__"
2: "\nSCSI - test-A\nccc\naaa\nbbb\n\n__Data__"
3: "\nSCSI - test-B\nccc\naaa\nbbb\n\n__Data__"
4: "\nSCSI - test-C\nccc\naaa\nbbb\n"

但是你错误地认为你得到了

1: "__Data__\nSCSI - test-A\nccc\naaa\nbbb\n\n"
2: "__Data__\nSCSI - test-B\nccc\naaa\nbbb\n\n"
3: "__Data__\nSCSI - test-C\nccc\naaa\nbbb\n"

解决方案:

my $after_data = 0;
while (<>) {
   if (/^__Data__$/) {
      print;
      $after_data = 1;
   }
   elsif ($after_data) {
      print;
      print "\n";
      $after_data = 0;
   }
}

您还可以使用段落模式:

local $/ = '';
while (<>) {
   print /^(.*\n.*\n)/;
   print "\n";
}

关于regex - 需要帮助使用 Perl 修复此正则表达式代码吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10644171/

相关文章:

java - String.equalsIgnoreCase - 大写与小写

java用其他字符替换后笔画

perl - 检测单行中的第一个或第二个文件

regex - Vim 正则表达式替换问题

javascript - 如何匹配 url 中可以以查询字符串结尾的文件扩展名?

c++ - Makefile 中扩展正则表达式列表的分隔符

r - 如何用数字对动态字符进行子串化(例如 : $1000, 100 个单位)

java - 频率分析算法

perl - 为什么 eq 不能处理我的字符串输入?

regex - 如何使用 Perl 替换在文件中具有转义序列的字符串?