使用Perl检查字符串是否只有英文字符

时间:2015-02-12 22:02:12

标签: regex perl

我有一个像这样的提交文件

%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}}。我觉得这是正在用正则表达式生锈,但我找不到答案。

2 个答案:

答案 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;
}