regexp逐行打印并删除最后一个单词

时间:2018-02-02 07:28:39

标签: regex perl

如果行包含多个单词,我试图从每行中删除最后一个单词。

如果行只有一个单词,则按原样打印,不需要删除它。

以下是行

address 34 address
value 1 value
valuedescription
size 4 size

从上面的行我想删除除第3行以外的每一行的所有最后一个单词,因为它只有一个单词使用regexp ..

我在regexp下面试过,它也删除单个字线

 $_ =~ s/\s*\S+\s*+$//; 

需要你的帮助。

3 个答案:

答案 0 :(得分:4)

您可以使用:

$_ =~ s/(?<=\w)\h+\w+$//m; 

RegEx Demo

<强>解释

  • (?<=\w):Lookbehind断言我们在最后一个字之前至少有一个单词char
  • \h+:匹配1个以上的水平空格
  • \w+:匹配带有1个以上字符的单词
  • $:行尾

答案 1 :(得分:1)

试试这个正则表达式:

^((?=(?:\w+ \w+)).*\b)\w+

用空白字符串替换每个匹配

Click for Demo

OR

\1

并将每个匹配项替换为^

Click for Demo

解释(第一个正则表达式):

  • (?=(?:\w+ \w+)) - 断言行的开头
  • .* - 确定字符串中是否包含2个字的正面预测
  • \K - 如果上述条件满足,则匹配任何字符的出现次数(换行符除外)直到行尾
  • \b - 忘记目前为止匹配的所有内容
  • \w+ - 回溯找到最后一个字边界
  • {{1}} - 匹配最后一个单词

答案 2 :(得分:0)

没有空格的单个单词与正则表达式匹配,因为你在\ S +之前和之后使用\ s *,而\ s *匹配空字符串。

您可以使用$ _ = ~s / ^(。* \ S)\ s +(\ S +)$ / $ 1 /;

[说明:如果行包含一些以非空格结尾的字符(存储在$ 1中),后跟一个或多个空白字符,后跟一个或多个非空白字符,则匹配RegEx 。如果匹配,请将其全部替换为第一部分($ 1)。]

虽然您可能希望修剪前导/尾随空格,如果您认为它可能包含任何内容 - 取决于您希望在这些情况下发生什么。