我有一个文件,里面有这样的意见书
%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。我觉得这是我生锈了,但我找不到答案。
发布于 2015-02-13 07:38:56
根据这些评论,你的问题似乎是:
$line =~ m/[^a-zA-z0-9_]*$/具体来说- ^在括号内,这意味着它不是一个“锚”。它实际上是一个否定运算符
请参阅:http://perldoc.perl.org/perlrecharclass.html#Negation
也可以列出不想匹配的字符。您可以使用插入符号(^)作为字符类中的第一个字符来完成此操作。例如,^a匹配任何不是小写的ASCII字母的字符,因此包含100多万个Unicode代码点。这个类被称为“否定”或“倒置”。
但重要的是--如果没有“行的开始”锚点,您的正则表达式就是零或多个实例(不管是什么),所以几乎可以匹配任何内容,因为它可以随意忽略行内容。
(Borodin的答案涵盖了这种模式匹配的其他一些选项,因此我将不再重复)。
发布于 2015-02-13 01:08:07
现在还不清楚你需要什么,所以这里有几个观察结果可以说明你所写的。
最好使用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语句
if ( $line =~ /\W/ ) {
    print "Non-English\n";
}
else {
    print $line;
}https://stackoverflow.com/questions/28488681
复制相似问题