使用正则表达式在perl中的字符串末尾附近的日期周围插入引号

时间:2016-06-30 21:58:43

标签: regex perl

我将数据行读入perl中的数组,如下所示:

aaa bbb    ccc ddd -
aaa bbb ccc ddd    eee -

我试图在每一行的特定字段周围注入引号 - secont为last,倒数第三。当我完成时,我希望这些线看起来像这样:

aaa bbb    "ccc ddd" -
aaa bbb ccc "ddd    eee" -

我尝试将该行拆分为数组并使用@array [-3]表示法,但该拆分除去了用作分隔符的所有空格。我想我需要使用带有替换的反向引用 - 例如:

s/(\s+[^\s]*\s+)$/\"$+\"/

除了我无法弄清楚如何匹配我需要的特定字段并跳过最后的字段。目前,它在换行符后面加上最后一个引号。

2 个答案:

答案 0 :(得分:1)

描述

\w+\s+\w+(?=\s-)

替换为: "$0"

Regular expression visualization

**要更好地查看图像,只需右键单击图像并在新窗口中选择视图

实施例

现场演示

https://regex101.com/r/dO1oU9/1

示例文字

aaa bbb    ccc ddd -
aaa bbb ccc ddd    eee -

替换后

aaa bbb    "ccc ddd" -
aaa bbb ccc "ddd    eee" -

解释

NODE                     EXPLANATION
----------------------------------------------------------------------
  \w+                      word characters (a-z, A-Z, 0-9, _) (1 or
                           more times (matching the most amount
                           possible))
----------------------------------------------------------------------
  \s+                      whitespace (\n, \r, \t, \f, and " ") (1 or
                           more times (matching the most amount
                           possible))
----------------------------------------------------------------------
  \w+                      word characters (a-z, A-Z, 0-9, _) (1 or
                           more times (matching the most amount
                           possible))
----------------------------------------------------------------------
  (?=                      look ahead to see if there is:
----------------------------------------------------------------------
    \s                       whitespace (\n, \r, \t, \f, and " ")
----------------------------------------------------------------------
    -                        '-'
----------------------------------------------------------------------
  )                        end of look-ahead
----------------------------------------------------------------------

答案 1 :(得分:1)

在此演示:https://regex101.com/r/zD3cP9/2

使用模式

((?:\w+\s*){2})(\s+-)

执行

aaa bbb    ccc ddd -
aaa bbb ccc ddd    eee -

将是

aaa bbb    "ccc ddd" -
aaa bbb ccc "ddd    eee" -

这个重复第一个子模式两次,因为它寻找破折号来完成它。有用,因为它易于维护。