(grep) 正则表达式以匹配非ASCII字符?

78 浏览
0 Comments

(grep) 正则表达式以匹配非ASCII字符?

在Linux上,我有一个目录里有很多文件。其中一些文件有非ASCII字符,但它们都是有效的UTF-8编码。有一个程序有个bug,导致它无法处理非ASCII文件名,我需要找出有多少受到影响的文件。我本来打算用find命令找到这些文件,然后再用grep命令打印出非ASCII字符,最后用wc -l命令统计数量。不一定非要用grep命令,我可以使用任何标准的Unix正则表达式,比如Perl、sed、AWK等。

然而,是否存在一个正则表达式可以匹配“任何非ASCII字符”?

0
0 Comments

正则表达式(Regex)是一种常用于匹配和搜索文本的工具。然而,在处理包含非ASCII字符的文本时,人们可能会遇到一些问题。本文将介绍一个关于如何匹配非ASCII字符的问题,并提供解决方法。

问题的出现是因为标准的grep命令不支持匹配非ASCII字符。要解决这个问题,可以参考Unicode正则表达式页面,该页面包含了一些有用的Unicode字符类,例如\p{Control},它可以匹配ASCII 0x00..0x1F或Latin-1 0x80..0x9F控制字符。

为了解决这个问题,我们可以使用其他支持Unicode字符匹配的工具,如Perl或Python等编程语言。下面是一个使用Perl语言的示例代码,用于匹配非ASCII字符:

#!/usr/bin/perl
use strict;
use warnings;
my $text = "Hello, 你好!";
if ($text =~ /\P{ASCII}/) {
    print "Text contains non-ASCII characters.\n";
} else {
    print "Text does not contain non-ASCII characters.\n";
}

上述代码中,我们使用了\p{ASCII}的反义——\P{ASCII},它可以匹配非ASCII字符。如果$text包含非ASCII字符,则打印"Text contains non-ASCII characters.",否则打印"Text does not contain non-ASCII characters."。

通过使用支持Unicode字符匹配的工具和相应的正则表达式语法,我们可以轻松地匹配非ASCII字符,以满足特定的需求。

0
0 Comments

在正则表达式中,有时候需要匹配非ASCII字符。然而,在处理ASCII字符的时候,我们需要注意一些特殊字符的处理。如果我们使用错误的正则表达式来匹配非ASCII字符,可能会将一些特殊字符也删除掉,导致结果不准确。因此,我们需要找到正确的正则表达式来匹配非ASCII字符。

在代码中,[^\x20-\x7E]是错误的ASCII匹配方式。这会删除掉包括换行符和其他特殊字符在内的ASCII字符。而正确的ASCII匹配方式应该是[^\x00-\x7F]。这样可以确保只删除非ASCII字符。

所以,如果我们想要匹配非ASCII字符,我们应该使用[^\x00-\x7F]。这样可以避免删除ASCII字符中的特殊字符,并且只匹配非ASCII字符。这样可以确保我们得到准确的结果。

总结起来,当我们需要匹配非ASCII字符时,我们应该使用[^\x00-\x7F]来确保我们只匹配非ASCII字符,并且不会删除ASCII字符中的特殊字符。这样可以避免结果的不准确性。

0
0 Comments

正文:

在编程中,有时我们需要使用正则表达式来匹配非ASCII字符。下面是一些关于匹配非ASCII字符的正则表达式以及解决方法。

首先,我们可以使用以下正则表达式来匹配单个非ASCII字符:

[^\x00-\x7F]

这是一个有效的PCRE(Perl-Compatible Regular Expression)表达式。

另外,我们也可以使用POSIX的简写形式来匹配非ASCII字符,具体如下:

- [[:ascii:]] - 匹配单个ASCII字符

- [^[:ascii:]] - 匹配单个非ASCII字符

然而,在使用POSIX的简写形式时需要注意,如果你的终端设置为UTF8编码,[^[:print:]] 将无法正常工作,你需要使用pcregrep命令而不是标准grep。

有人问道为什么在UTF8终端下 [^[:print:]] 无法正常工作,实际上在UTF8终端下该表达式是可以正常工作的,例如在UTF8终端下运行 27.chr =~ /[^[:print:]]/ 是可以得到正确结果的。

另外,如果我们想要修复一些有问题的文件名,可以使用如下命令:

rename 's/[^\x00-\x7F]//g' *

你也可以使用-n选项来先检查重命名的结果是否正确。

还某些情况下在PowerShell或.NET中无法支持[[:ascii:]],而\P{IsBasicLatin}在字符i上也无法正常工作。

最后,有人问是否非ASCII字符被认为是不可打印字符。

0