3

我已阅读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 文件中的“逐字”环境时,会返回错误。

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

4

3 回答 3

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
于 2012-06-17T15:03:25.070 回答
0

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

$string =~ s/[[:punct:]]//g;
于 2012-06-17T01:58:08.907 回答
0

我通过使其成为 LaTeX 问题而不是 perl 正则表达式问题来“解决”了这个问题。

我放弃了 pdflatex 并改用 xelatex 。前者跑得更快,但会“窒息”不熟悉的角色,甚至是看不见的角色。后者运行速度较慢,但​​似乎不介意任何角色。它根本不会渲染它不知道如何处理的字符。例如,我当前的 LaTeX 代码可以很好地呈现多调希腊语(现在写古希腊作者的字符),但它为任何中文字符留下了空白。

于 2020-05-01T16:25:54.187 回答