我在regEx中使用什么来匹配MS Word字符

时间:2009-05-11 20:22:34

标签: regex

我需要查找并删除字符串中的所有非标准ascii字符(通常由MS Word提供)。我不完全确定这些角色是什么......比如花哨的撇号和双向引号以及所有这些。那是unicode吗?我知道怎么做火腿[a-z等等],但我希望有一种更优雅的方式来排除键盘上没有的东西。

6 个答案:

答案 0 :(得分:2)

处理这个问题的最好方法可能是使用字符集,是的,但是对于它的价值,我已经通过这种快速而肮脏的方法取得了一些成功,角色类

[\x80-\x9F]

这是有效的,因为对我来说“Word chars”的问题是Unicode中非法的问题,而且我无法清理用户输入。

答案 1 :(得分:1)

Microsoft应用程序因使用花式字符(如引号,em-dashes等)而臭名昭着,需要特殊处理而不添加任何实际值。在某些情况下,您所要做的就是确保使用其中一个扩展字符集来读取文本(例如,windows-1252而不是ISO-8859-1)。但是,有一些工具可以用普通但普遍支持的等价物取代那些花哨的角色。 Google为“demoronizer”或“AsciiDammit”。

答案 2 :(得分:1)

我通常使用一个JEdit宏来代替它们中最常见的一个更友好的ascii版本,即:

  • 连字符和破折号到减号;
  • supsension dots(单个字符)到多个点;
  • 列出项目点到星号;

它很容易适应Word / Openoffice /等等,当然也可以根据您的需要进行修改。我写了一篇关于这个主题的文章: http://www.megadix.it/node/138

干杯

答案 3 :(得分:0)

您可能正在看的是UTF-8格式的Unicode字符。如果是这样,只需用正则表达式语言转义它们。

答案 4 :(得分:0)

我解决这个问题的方法是编写一个Perl脚本,它给出了ASCII范围之外的所有字符(0 - 127):

#!/usr/bin/perl

use strict;
use warnings;

my %seen;
while (<>) {
    for my $character (grep { ord($_) > 127 } split //) {
        $seen{$character}++;
    }
}

print "saw $_ $seen{$_} times, its ord is ", ord($_), "\n" for keys %seen;
然后,我创建了这些字符到我想要的字符的映射,并在文件中替换它们:

#!/usr/bin/perl

use strict;
use warnings;

my %map = (
    chr(128) => "foo",
    #etc.
);

while (<>) {
    s/([\x{80}-\x{FF}])/$map{$1}/;
    print;
}

答案 5 :(得分:0)

我要做的是,使用AutoHotKey或python SendKeys或某种可视基本,它会将所有可能的密钥(也包括已应用和未应用的移位)发送给Word文档。< / p>

在SendKeys中,它将是

形式的脚本
chars = ''.join([chr(i) for i in range(ord('a'),ord('z'))])
nums = ''.join([chr(i) for i in range(ord('0'),ord('9'))])
specials = ['-','=','\','/',','.',',','`']
all = chars+nums+specials
SendKeys.SendKeys("""
    {LWIN}
    {PAUSE .25}
    r
    winword.exe{ENTER}
    {PAUSE 1}
    %(all)s
    +(%(all)s)
    "testQuotationAndDashAutoreplace"{SPACE}-{SPACE}a{SPACE}{BS 3}{LEFT}{BS}
    {Alt}{PAUSE .25}{SHIFT}
    changeLanguage
    %(all)s
    +%(all)s
"""%{'all':all})

然后我将文档保存为文本,并将其用作键盘布局中所有可置换键的数据库(您可能希望多次替换默认输入语言以接收绝对所有可显示的字符)。

如果char在结果文本文档中 - 它是可显示的,否则不是。不需要正则表达式。当然,您可以在字符或程序中嵌入字符范围。