Perl:模式关闭后如何替换内容

时间:2018-11-26 01:05:15

标签: regex perl

所以我不能使用$'变量

但是我需要找到一个以“ by:”开头的字符串,然后是任何字符的文件中的模式,然后将“ by:”之后的任何字符替换为现有的字符串$ foo

我使用$ ^ I和while循环,因为我需要更新文件中的多个字段。

我在考虑[s ///]

s/(by\:[a-z]+)/$foo/i

我需要帮助。是的,这是一个作业问题,但是我在5个小时内就失去了许多脑细胞

1 个答案:

答案 0 :(得分:1)

替换时出现一些问题:

  1. 您说要匹配TestFunctionObject(冒号后的空格),但是您的正则表达式将永远不会匹配该空格。
  2. 模式by:表示将一个或多个出现的字母[a-z]+匹配到a。但是您说过要匹配“任何字符”。可能是零个字符,并且可能包含非字母。
  3. 您已将比赛替换为z,但输了$foo。整个匹配的字符串都将替换为替换字符串。
  4. 无需在您的模式中转义by:
  5. 您正在用括号捕获整个匹配项,但没有在任何地方使用它。

我假设您正在逐行处理文件。您希望“以字符串:开头,后跟任何字符”。这是正则表达式:

by:

/^by: .*/ 匹配行首。然后^与这些字符完全匹配。 by:匹配换行符以外的任何字符,并且.表示零个或多个前一项。因此*与该行上的所有其余字符匹配。

”用现有字符串.*替换by:之后的任何字符。我假设您是指变量$foo的内容,而不是文字字符$foo。这是:

$foo

因为我们匹配了s/^by: .*/by: $foo/; ,所以我在替换字符串中重复了它,因为您想保留它。 by:将插入替换字符串中。

另一种写法是:

$foo

在这里,我们在第一组括号中捕获了文本s/^(by: ).*/$1$foo/ 。该文本将在by:变量中可用,因此我们可以将其插入到替换字符串中。