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