【问题标题】:Using perl lookbehind(or lookahead) to capture word使用 perl lookbehind(或lookahead)捕获单词
【发布时间】:2017-01-09 19:39:47
【问题描述】:

我有一系列文件,每个文件都以句子开头

创建表空间表空间名称 data.dbf

我需要提取 tablespace-name 并将 data.dbf 替换为 tablespace-name.dbf。

我是 perl 新手,但看起来我需要的是在 perl 中向后看(或向前看)正则表达式。

如何做到这一点?

【问题讨论】:

  • 您可以尝试使用替换:s/^(create tablespace) (tablespace-name) (data.dbf)/$1 $2 $2.dbf/
  • tablespace-name 在每个文件中都不同,我以前不知道那会是什么。这就是为什么我认为最好使用lookahead 或lookbehind 来获取“data.dbf”之前的单词或“tablespace”之后的单词。
  • 为什么不直接替换这个? `数据`如s/ data//
  • @Borodin 我认为它与ikegami 的答案中包含的内容几乎相同。
  • @Peter:看来您不了解Stack Overflow 的哲学。你现在已经问了五个问题,所有问题的评价都很差,而且从未接受过一个答案。请使用Tour 并阅读How do I ask a good question?。然后您应该阅读What should I do when someone answers my question? 并将其应用于您收到的所有答案。您聘请了许多计算机专业人士,但没有任何适当的回应。

标签: perl lookahead lookbehind


【解决方案1】:
if (defined( $_ = <> )) {
   s/^create \s+ tablespace \s+ (\S+) \s+ \K data (?= \.dbf \b )/$1/x;
   print;

   print while <>;
}

从技术上讲,这里不需要环顾四周和\K

s/^ ( create \s+ tablespace \s+ ) (\S+) (\s+) data ( \.dbf \b )/$1$2$3$2$4/x

它们只是让事情变得不那么嘈杂。

【讨论】:

  • 我认为您的编辑包含不必要的空格,您不是说^create\s+tablespace\s+(\S+)\s+\Kdata(?=\.dbf\s*\z)
  • @AbhiNickz,这将是等效的,但可读性较差。注意/x 的使用。它使空格变得不重要,允许添加空格以提高可读性,就像在常规 Perl 代码中一样。
  • 查看此链接:您的正则表达式不起作用regex
  • @AbhiNickz,您的测试失败,因为您将 /x 更改为 /g。
  • @AbhiNickz - @ikegami 使用 /x 修饰符允许添加任意空格以提高可读性。
猜你喜欢
  • 1970-01-01
  • 2019-10-18
  • 1970-01-01
  • 1970-01-01
  • 2021-12-06
  • 2021-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多