regex - 我的 Perl 正则表达式有什么问题

标签 regex perl shell unix

我正在尝试在文本文件中查找不良记录:

文件中数据的格式为:

somedata\x1Fsomemoredata\x1F\n
somedata2\x1Fsomemoredata2\x1F\n

(\x1F 是十六进制值的单位分隔符,此数据使用 Perl 的 chr(31) 在另一个脚本中写出,这是单位分隔符的 ascii 代码)

我用 perl 写了这个:

## the format of each record in the file: alphanumericdata\x1Falphanumericdata\x1F\n
my $regex = "/[A-z0-9]+\\x1F[A-z0-9]+\\x1F\\n\$/";

print $regex;

#### just opening file
my $filename = "data.txt";
open(my $fh, "<:encoding(UTF-8)", $filename)
   or die "Could not open file '$filename' $!";

### reading file line by line
while (my $row = <$fh>) {

   ## if line does not match format, print the culprit!!!
   if($row !~ $regex) {
       print $row;
   }
}

close $fh;

这会打印每一行,但我知道大多数行的格式都正确,因此我的正则表达式有些问题。

我在这里犯了一些菜鸟错误吗?

最佳答案

问题在于您在模式中包含了 Perl 匹配运算符(Perl 代码)。

my $pat = "^[A-z0-9]+\\x1F[A-z0-9]+\\x1F\\n\\z";

if ($row !~ m/$pat/)
if ($row !~ /$pat/)   # shortcut
if ($row !~ $pat)     # shortcut

将模式硬编码为字符串文字是没有意义的,所以让我们假设从文件中读取 $pat 。在这种情况下,您需要预编译它。

# Pretend we're reading  ^[A-z0-9]+\x1F[A-z0-9]+\x1F\n\z  from a file.
my $pat = "^[A-z0-9]+\\x1F[A-z0-9]+\\x1F\\n\\z";

my $re = qr/$pat/;

if ($row !~ m/$re/)
if ($row !~ /$re/)   # shortcut
if ($row !~ $re)     # shortcut

如果您对文件进行硬编码,则可以直接使用 qr//。它可以让你免于逃避一堆斜杠。

my $re = qr/^[A-z0-9]+\x1F[A-z0-9]+\x1F\n\z/;

if ($row !~ m/$re/)
if ($row !~ /$re/)   # shortcut
if ($row !~ $re)     # shortcut

在这种情况下,似乎没有理由提前指定模式。您可以在匹配运算符中指定 right。

if ($row !~ m/^[A-z0-9]+\x1F[A-z0-9]+\x1F\n\z/)
if ($row !~ /^[A-z0-9]+\x1F[A-z0-9]+\x1F\n\z/)   # same

关于regex - 我的 Perl 正则表达式有什么问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24581142/

相关文章:

Java正则表达式替换重复字符(包括非后续字符)

android - 在 adb shell 命令行中将 1 个命令的输出通过管道传输到其他命令

regex - 基于正则表达式在 Perl 中的 foreach 中制作数组的动态哈希

python - 简单的进程间通信

bash - SSH Heredoc在另一台服务器上运行Perl脚本找不到正确的路径

Linux:如何将每个文件移动到相应命名的文件夹中

linux - 检查变量是否有值或为空?

javascript - 查找包含特定字母和特殊字符的所有单词

Javascript string.replace() 用于替换

正则表达式整个字符串的确切长度