【问题标题】:Perl regex to globally insert newline before pattern matchPerl 正则表达式在模式匹配之前全局插入换行符
【发布时间】:2012-11-26 14:23:31
【问题描述】:

我正在努力在匹配字符串之前插入换行符,该字符串由句点后跟 2 或 3 个字符(字母数字)并以另一个句点结尾。如果可能,这需要是作用于整个文件的单个语句。

类似 (?):

$contents =~ s/\.{2,3}\./\n\.<what goes here?>\./g;

具体来说,我正在分两步处理包含许多目录记录的文件。 步骤 1:从文件中删除所有回车符。 第 2 步:查找文本字符串,例如 .AUTH。和.RE。甚至 0.856。并使这些中的每一个都成为新行的开始。我可以通过一系列特定的替换来做到这一点,

$contents=~s/\.RE\./\n\.RE\./g;
$contents=~s/\.AUTH\./\n\.AUTH\./g;
$contents=~s/\.TITL\./\n\.TITL\./g;

但我的理解是,我也可以用一条语句更有效地做到这一点(使用正则表达式内置变量?)

谢谢,

汤姆

【问题讨论】:

  • . 字符不必在替换字符串中转义。

标签: regex perl global


【解决方案1】:

要删除所有换行符,请使用

$contents =~ s/\n//g;

要添加所需的换行符,请使用

$contents =~ s/(?=[.][a-z\d]{2,3}[.])/\n/ig;

【讨论】:

  • 这对数字有效,但对字母没有任何作用。换句话说,0.856。字符串前面有一个换行符,而不是 .AUTH。行。
  • @ThomasShepard - 当然它不适用于.AUTH.,因为您被要求输入 2-3 个字母数字字符串,而 AUTH 有 4 个字符。简单的数学,对吧?那么谁错了?如果您需要最多 4 个字符,则将 {2,3} 更改为 {2,4},您应该可以继续...
  • 哎呀,我脸红了!当然,你是对的,是的,它现在确实有效。非常感谢!
  • @ThomasShepard - 最后你会发现谁是错的,谁是对的。所以,现在请接受我的解决方案/答案(我希望你知道怎么做)。谢谢你,祝你好运:)
【解决方案2】:
$contents =~ s/(\.\w{2,3}\.)/\n$1/;

使用括号记住匹配的字符串,并在替换部分使用 $1 来引用它。

【讨论】:

  • 解决方案可以满足您的要求:“在匹配字符串之前插入换行符,该字符串由句点后跟 2 或 3 个字符(字母数字)并以另一个句点结尾”,因此我不理解反对票。如果您更喜欢其他解决方案也可以,但至少不要对可行的方法投反对票。
猜你喜欢
  • 2010-10-31
  • 2011-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-05
  • 1970-01-01
  • 2011-04-05
  • 1970-01-01
相关资源
最近更新 更多