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

问题描述 投票:3回答:3

我看过 从字符串中删除非字母数字字符。 并不相信它能解决我的问题。

我有一个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 文件中的 "逐字记录 "环境时,会返回一个错误。

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

regex perl latex
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

0
投票

我想你的意思是要去掉所有的标点符号吧? 如果是这样的话,可以试试。

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

0
投票

我把它变成了一个LaTeX的问题,而不是perl的regex问题,从而解决了这个问题。

我放弃了pdflatex,改用xelatex。前者运行得更快,但是对不熟悉的字符,甚至是不可见的字符都会 "窒息"。后者运行速度较慢,但它似乎不介意任何字符。它只是不渲染一个它不知道如何处理的字符。例如,我现在的LaTeX代码可以很好地渲染多音字希腊语(现在古希腊作者所写的字符),但它对任何汉字都是一片空白。

© www.soinside.com 2019 - 2024. All rights reserved.