perl正则表达式部分单词匹配

时间:2015-01-13 22:35:00

标签: regex perl

我正在尝试删除包含两个键的所有单词(在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

4 个答案:

答案 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

regex101 demo.