我正在尝试删除包含两个键的所有单词(在Perl中)。
例如,字符串
garble variable10 variable1 vssx vddx xi_21_vssx vddx_garble_21 xi_blahvssx_grbl_2
应该成为
garble variable10 variable1
只需删除正常的,未悬挂/前置的键很容易:
$var =~ s/(vssx|vddx)/ /g;
但是我无法弄清楚如何删除整个xi_21_vssx部分。我试过了:
$var =~ s/\s.*(vssx|vddx).*\s/ /g
哪个不能正常工作。我不明白为什么...似乎\ s应匹配空间,然后。*匹配任何一个模式,然后模式,然后。*匹配模式之前的任何东西,直到下一个空格。
我也尝试用\ b(单词边界)替换\ s(空格),但它也有效。另一种尝试:
$var =~ s/ .*(vssx|vddx).* / /g
$var =~ s/(\s.*vssx.*\s|\s.*vddx.*\s)/ /g
以及其他一些mungings。
非常感谢任何指针/帮助。
-John
答案 0 :(得分:1)
我认为正则表达式只是
$var =~ s/\S*(vssx|vddx)\S*/ /g;
答案 1 :(得分:0)
试试这个正则表达式:
\b[\w]*(vssx|vddx)[\w]*\b
答案 2 :(得分:0)
我试图删除所有[...]
的单词
这类问题非常适合grep
,可用于查找列表中与条件匹配的元素。您可以使用split
将字符串转换为单词列表,然后按以下方式对其进行过滤:
use strict;
use warnings;
use 5.010;
my $string = 'garble variable10 variable1 vssx vddx xi_21_vssx vddx_garble_21 xi_blahvssx_grbl_2';
my @words = split ' ', $string;
my @filtered = grep { $_ !~ /(?:vssx|vddx)/ } @words;
say "@filtered";
garble variable10 variable1
答案 3 :(得分:0)
您可以使用
\s*\S*(?:vssx|vddx)\S*\s*
你的正则表达式的问题是:
.*
应该是非贪婪的。.*
前面的(vssx|vddx)
必须与空格字符不匹配,因此您必须使用\S*
。请注意,无法正确保留单词之间的空格 - 即a vssx b
将成为ab
。