如何使perl正则表达式匹配ASCII和Unicode

时间:2016-04-12 12:38:53

标签: regex perl unicode

我有一个解析Windows打印机驱动程序的inf文件的程序。

只要文件写入ASCII,系统就可以正常工作。

因此,例如,正则表达式m/^\[([^\]\]*)$/可以很好地匹配节标题。

对于Unicode行,该行匹配m/^\0\[([^\]\0\]*)$/,当然不是第一行。因此,文件未正确解析。

如何使perl正则表达式忽略\0字符?

3 个答案:

答案 0 :(得分:1)

1)确保您拥有Perl 5.14或更新版本。

2)阅读perlre联机帮助页,尤其是标题为"字符集修饰符"

的部分

3)在正则表达式上使用/ a,/ u,/ l或/ d标志,具体取决于最适合您需要的行为。

答案 1 :(得分:1)

你不能忽视"空字符。这样,数据中的任何非ASCII字符都无法正确解释

听起来你正试图解析UTF-16BE编码的数据而不解码它。使用核心Encode模块将其解码为Perl内部表示,如此

use strict;
use warnings 'all';
use feature 'say';

use Encode;

my $bytes = "\0[\0x\0x\0x\0]";

my $string = decode('UTF-16BE', $bytes, Encode::FB_CROAK);

say $string;

输出

[xxx]

如果我对编码有误,请使用

显示输入字符串的转储
use Data::Dumper;
$Data::Dumper::Useqq = 1;
$Data::Dumper::Terse = 1;

print Dumper $bytes;

答案 2 :(得分:0)

始终解码输入并对输出进行编码。具体来说,改变

open(my $fh, '<', $qfn)

open(my $fh, '<:encoding(UTF-16le)', $qfn)

这会将文本从字节解码为代码点,从而使您的匹配能够正常工作。