正则表达式删除所有非键盘字符

时间:2012-06-17 01:53:34

标签: regex perl latex

我已阅读Remove Non-Alphanumeric Characters from a String并且不相信它可以解决我的问题。

我有一个包含单个正则表达式的Perl脚本。这旨在用文本文件中的每个非键盘字符替换空格。

#!/opt/local/bin/perl
#   Delete any character (replace it with a space) that is not a visible keyboard
#   character.
if($#ARGV!=0) {
        print "usage: pass a *single* filename as argument. Filename is a text file ...\n";
        exit;
}
$infile=$ARGV[0];
#print "\$infile is $infile\n";
open(SOMEFILE, $infile)||die("can't open $infile for reading");
while(<SOMEFILE>) {
    $oldStr = $_;
    $newStr=$oldStr;
    $newStr=~s/[^\w\s`~!@#\$\%^&*()-_=+[\]{}\\|;:'",<.>\/?àèìòùáéíóúäëïöüâêîôûÿøÀÈÌÒÙÁÉÍÓÚÄËÏÖÜÂÊÎÔÛŸØçÇß¿“”‘’æÆ£¢]/ /g;
    print "$newStr";
}
close SOMEFILE;
exit;

这应删除所有有趣的隐形字符。但它似乎不起作用。示例文件:

$ hex 1bad
0000  43 61 74 68 65 72 69 6e  65 c2 a0 0a              Catherin e...

文件1bad包含从电子邮件复制和粘贴的文本。当该文本插入LaTeX文件中的“逐字”环境时,将返回错误。

为什么这个正则表达式不起作用?

3 个答案:

答案 0 :(得分:4)

您的过滤器写得更简单:

perl -C -Mutf8 -lpe's/[^\w\s`~!@#\$\%^&*()-_=+[\]{}\\|;:\x{27}",<.>\/?àèìòùáéíóúäëïöüâêîôûÿøÀÈÌÒÙÁÉÍÓÚÄËÏÖÜÂÊÎÔÛŸØçÇß¿“”‘’æÆ£¢]/ /g' 1bad

它按设计工作,示例文件中单词末尾的"\N{NO-BREAK SPACE}"字符与\s匹配,因此替换。你需要将这个角色类分开来更具体。在Perl 5.16中,\s匹配以下字符:

U+0009 CHARACTER TABULATION
U+000A LINE FEED
U+000C FORM FEED
U+000D CARRIAGE RETURN
U+0020 SPACE
U+0085 NEXT LINE
U+00A0 NO-BREAK SPACE
U+1680 OGHAM SPACE MARK
U+180E MONGOLIAN VOWEL SEPARATOR
U+2000 EN QUAD
U+2001 EM QUAD
U+2002 EN SPACE
U+2003 EM SPACE
U+2004 THREE-PER-EM SPACE
U+2005 FOUR-PER-EM SPACE
U+2006 SIX-PER-EM SPACE
U+2007 FIGURE SPACE
U+2008 PUNCTUATION SPACE
U+2009 THIN SPACE
U+200A HAIR SPACE
U+2028 LINE SEPARATOR
U+2029 PARAGRAPH SEPARATOR
U+202F NARROW NO-BREAK SPACE
U+205F MEDIUM MATHEMATICAL SPACE
U+3000 IDEOGRAPHIC SPACE

答案 1 :(得分:0)

我假设您的意思是删除任何标点符号吗?如果是这样,试试:

$string =~ s/[[:punct:]]//g;

答案 2 :(得分:0)

我通过使其成为LaTeX问题而不是perl regex问题来“解决”了。

我放弃了pdflatex,改用xelatex。前者运行速度更快,但会被不熟悉的字符“窒息”,甚至是看不见的字符。后者运行较慢,但似乎不介意任何角色。它只是不会渲染不知道如何处理的角色。例如,我当前的LaTeX代码可以使多调性希腊语(现在写古希腊作家的字符)就很好了,但是对于任何汉字它都是空白。