【问题标题】:Perl regexp \A doesn't match start of file?Perl 正则表达式 \A 与文件开头不匹配?
【发布时间】:2020-12-26 04:11:08
【问题描述】:

我逐行遍历文件,挑选出以 asterix 开头的行:*。我的简单正则表达式适用于文件的第一行以外的所有行。

DESIRED BEHAVIOR 是:正则表达式应该正确匹配以星号开头的行。

实际行为是:如果星号出现在文件的第一行,则正则表达式无法匹配。

我的调试尝试包括:

  1. 在文件开头添加空行。结果:以前丢失的行,现在位于文件的第二行,正则表达式正确匹配。

  2. 从正则表达式中删除\A,只匹配asterix。正则表达式现在正确匹配文件的第一行。

  3. 尝试使用^ 而不是\A。文件的第一行仍然无法匹配。

重现的最少代码

   while (<$input_fh>) {
     chomp;
     $line = $_;
     if ($line =~ /\A\*/) {
        ...
     }
  }

输入文件由可能以或不以星号开头的文本行组成。

【问题讨论】:

  • 您的文件中不包含 BOM 吗?
  • 因为一个BOM长于一个字节(实际字节数取决于编码)。
  • 当您遇到这些问题时,使用Data::DumperDevel::Peek 检查字符串可以说明这些问题。
  • Data::Dumper 和$Data::Dumper::Useqq = 1; 是你想要的。 (Devel::Peek 可以帮助调试 XS 模块。不是这里的问题。)
  • 您还可以使用核心B 模块中的perlstring 函数来查看Perl 认为您的字符串是什么。 use B "perlstring"; printf "read line: %s\n", perlstring $line;

标签: regex perl


【解决方案1】:

/\A\*/ 匹配字符串的开头,然后是星号字符。

您需要匹配开头和星号之间的任何符号。

使用

/\A.*?\*/

proof

说明

--------------------------------------------------------------------------------
  \A                       the beginning of the string
--------------------------------------------------------------------------------
  .*?                      any character except \n (0 or more times
                           (matching the least amount possible))
--------------------------------------------------------------------------------
  \*                       '*'

【讨论】:

  • 这不能回答问题!
猜你喜欢
  • 1970-01-01
  • 2012-02-23
  • 1970-01-01
  • 2020-02-19
  • 1970-01-01
  • 2022-01-11
  • 1970-01-01
  • 1970-01-01
  • 2019-06-01
相关资源
最近更新 更多