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 ファイルの「逐語的」環境に挿入すると、エラーが返されます。

この正規表現が機能しないのはなぜですか?

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 に答える