如果行包含多个单词,我试图从每行中删除最后一个单词。
如果行只有一个单词,则按原样打印,不需要删除它。
以下是行
address 34 address
value 1 value
valuedescription
size 4 size
从上面的行我想删除除第3行以外的每一行的所有最后一个单词,因为它只有一个单词使用regexp ..
我在regexp下面试过,它也删除单个字线
$_ =~ s/\s*\S+\s*+$//;
需要你的帮助。
答案 0 :(得分:4)
您可以使用:
$_ =~ s/(?<=\w)\h+\w+$//m;
<强>解释强>
(?<=\w)
:Lookbehind断言我们在最后一个字之前至少有一个单词char \h+
:匹配1个以上的水平空格\w+
:匹配带有1个以上字符的单词$
:行尾答案 1 :(得分:1)
试试这个正则表达式:
^((?=(?:\w+ \w+)).*\b)\w+
用空白字符串替换每个匹配
OR
\1
并将每个匹配项替换为^
解释(第一个正则表达式):
(?=(?:\w+ \w+))
- 断言行的开头.*
- 确定字符串中是否包含2个字的正面预测\K
- 如果上述条件满足,则匹配任何字符的出现次数(换行符除外)直到行尾\b
- 忘记目前为止匹配的所有内容\w+
- 回溯找到最后一个字边界答案 2 :(得分:0)
没有空格的单个单词与正则表达式匹配,因为你在\ S +之前和之后使用\ s *,而\ s *匹配空字符串。
您可以使用$ _ = ~s / ^(。* \ S)\ s +(\ S +)$ / $ 1 /;
[说明:如果行包含一些以非空格结尾的字符(存储在$ 1中),后跟一个或多个空白字符,后跟一个或多个非空白字符,则匹配RegEx 。如果匹配,请将其全部替换为第一部分($ 1)。]
虽然您可能希望修剪前导/尾随空格,如果您认为它可能包含任何内容 - 取决于您希望在这些情况下发生什么。