【问题标题】:perl -pe regex problemperl -pe 正则表达式问题
【发布时间】:2011-02-10 23:43:39
【问题描述】:

我使用 perl 来检查一些文本输入的正则表达式模式,但有一个模式不适用于 perl -pe。

以下模式不适用于命令调用:

s![a-zA-Z]+ +(?:.*?)/(?:.*)Comp-(.*)/.*!$1!

我使用 linux shell。以下电话我用来测试我的正则表达式:

cat test | perl -pe 's![a-zA-Z]+ +(?:.*?)/(?:.*)Comp-(.*)/.*!$1!'

文件测试:

A MaintanceGie?\195?\159mannFlock/System/Comp-Database.cpp
MaintanceGie?\195?\159mannFlock/System/Comp-Cache/abc.h

结果:

A MaintanceGie?\195?\159mannFlock/System/Comp-Database.cpp
缓存

如何删除第一个结果?

感谢您的建议。

【问题讨论】:

  • 你用的是什么外壳?你的输入是什么?您的预期输出是什么?
  • 那个古怪的八进制反斜杠到底是什么——呃,我的意思是非八进制——在那里搞砸了?对我来说当然是编码问题!
  • 输出是特殊字符ok。

标签: regex perl


【解决方案1】:

"Comp-(.*)" 之后的最后一个斜线可能是它的作用。您在“数据库”中的文件内容没有斜线。尝试将Comp-(.*)/.* 替换为Comp-(.*)[/.].*,以便匹配子目录或文件扩展名。

【讨论】:

  • 我的数据有错误。但是,当不匹配时,为什么要让我整行呢?
【解决方案2】:
$ cat 输入
MaintanceGie?\195?\159mannFlock/System/Comp-Database.cpp
MaintanceGie?\195?\159mannFlock/System/Comp-Cache/abc.h

$ perl -ne '打印 if s![a-zA-Z]+ +(?:.*?)/(?:.*)Comp-(.*)/.*!$1!'输入
缓存

【讨论】:

    【解决方案3】:

    问题在于正则表达式中的最后一个斜杠字符。它不是转义点,而是输入字符串中缺少的普通斜杠字符。试试这个:

    s![a-zA-Z]+ +(?:.*?)/(?:.*)Comp-(.*)[./].*!$1!
    

    编辑:更新以匹配新的输入数据并添加了另一个选项:

    另一方面,您的替换正则表达式可能会被替换为:

    perl -ne 'print "$1\n" if /Comp-(.*?)[.\/]/'
    

    那么就没有必要用它包含的任何东西来解析整行了。

    【讨论】:

    • 使用\s+而不是`+`也可能没有坏处。
    • 我的数据有错误。但是,当不匹配时,为什么要让我整行呢? \s+ 是什么意思?没听说过。
    • 因为您使用 s/// 运算符来进行正则表达式替换。如果正则表达式不匹配,则不进行替换。
    • 我真的讨厌看到[a-z] 硬编码到任何比 1960 年代更晚的问题,即不遵循某些 RFC 说必须的问题。 Perl 有一天会为此发出警告。 Here’s why.
    • @tchrist 完全同意,这就是我用另一个选项更新答案的原因。另一方面,输入数据看起来像 Subversion 输出,所以 [a-zA-Z] 可能是 [AUD]
    【解决方案4】:

    \s 匹配空格(空格、制表符和换行符),“+”表示一个或多个字符。在这种情况下,'\s+' 意味着搜索一个或多个空格。

    cat test
    A   MaintanceGie?\195?\159mannFlock/System/Comp-Database.cpp
    A   MaintanceGie?\195?\159mannFlock/System/Comp-Cache/abc.h
    
    perl -ne 'print "$1\n" if /\w+?\d+?\d+\w+\/\w+\/Comp-(\w+)[\/]/' test
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多