我有一个像这样的提交文件
%TRYYVJT128F93506D3<SEP>SOYKCDV12AB0185D99<SEP>Rainie Yang<SEP>Ai Wo Qing shut up (OT: Shotgun(Aka Shot Gun))
%TRYYVHU128F933CCB3<SEP>SOCCHZY12AB0185CE6<SEP>Tepr<SEP>Achète-moi
我正在使用此正则表达式删除除歌曲名称之外的所有内容。
$line =~ s/.*>|([([\/\_\-:"``+=*].*)|(feat.*)|[?¿!¡\.;&\$@%#\\|]//g;
我想确保打印的唯一字符串是仅包含英文字符的字符串,因此在这种情况下,由于Ai Wo Quing shut up
,它将是第一首歌曲标题è
而不是下一首歌曲。if ( $line =~ m/[^a-zA-z0-9_]*$/ ) {
print $line;
}
else {
print "Non-english\n";
。
我试过这个
Non-english
我认为这只会匹配英文字符,但它始终会打印{{1}}。我觉得这是正在用正则表达式生锈,但我找不到答案。
答案 0 :(得分:2)
在评论之后,您的问题似乎是:
$line =~ m/[^a-zA-z0-9_]*$/
具体来说 - ^
位于括号内,这意味着它不会充当&#39;锚点。它实际上是一个否定运算符
请参阅:http://perldoc.perl.org/perlrecharclass.html#Negation
也可以列出您不想匹配的字符。您可以使用插入符号(^)作为字符类中的第一个字符。例如,[^ a-z]匹配任何非小写ASCII字母的字符,因此包含超过一百万个Unicode代码点。据说该课程被否定了#34;或&#34;倒置&#34;。
但重要的是 - 没有&#39;行的开头&#39;锚,你的正则表达式是零或多个实例(无论如何),所以几乎可以匹配任何东西 - 因为它可以自由地忽略行内容。
(鲍罗丁的回答涵盖了这种模式匹配的其他一些选项,因此我不会重现)。
答案 1 :(得分:1)
目前还不清楚你需要什么,所以这里有几个与你所写的内容相符的观察结果。
最好使用split
来划分<SEP>
上的每一行数据,我认为这是分隔符。你的问题要求第四个这样的领域,比如这个
use strict;
use warnings;
use 5.010;
while ( <DATA> ) {
chomp;
my @fields = split /<SEP>/;
say $fields[3];
}
__DATA__
%TRYYVJT128F93506D3<SEP>SOYKCDV12AB0185D99<SEP>Rainie Yang<SEP>Ai Wo Qing shut up (OT: Shotgun(Aka Shot Gun))
%TRYYVHU128F933CCB3<SEP>SOCCHZY12AB0185CE6<SEP>Tepr<SEP>Achète-moi
<强>输出强>
Ai Wo Qing shut up (OT: Shotgun(Aka Shot Gun))
Achète-moi
此外,word
字符类\w
完全匹配[a-zA-z0-9_]
(和\W
匹配补码),因此您可以像这样重写if
语句< / p>
if ( $line =~ /\W/ ) {
print "Non-English\n";
}
else {
print $line;
}