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

perl regex partial word match

我正在尝试删除所有包含两个键的单词(在 Perl 中)。

例如,字符串

garble variable10 variable1 vssx vddx xi_21_vssx vddx_garble_21 xi_blahvssx_grbl_2

应该变成

garble variable10 variable1

要删除普通的 unappended/prepended 键很简单:

$var =~ s/(vssx|vddx)/ /g;

但是我不知道如何让它删除整个 xi_21_vssx 部分。我试过了:

$var =~ s/\s.*(vssx|vddx).*\s/ /g

无法正常工作。我不明白为什么......似乎 \s 应该匹配 space,然后 .* 匹配任何模式之一,然后是模式,然后 .* 匹配模式之前的任何东西直到下一个 space.

我也尝试用 \b(单词边界)替换 \s(whitespace),但它也奏效了。另一次尝试:

$var =~ s/ .*(vssx|vddx).* / /g
$var =~ s/(\s.*vssx.*\s|\s.*vddx.*\s)/ /g

以及一些其他的 mungings。

任何 pointers/help 将不胜感激。

-约翰

试试这个作为正则表达式:

\b[\w]*(vssx|vddx)[\w]*\b

I am trying to remove all words that [...]

这类问题很适合 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

你可以使用

\s*\S*(?:vssx|vddx)\S*\s*

你的正则表达式的问题是:

  • .* 应该是非贪婪的。
  • (vssx|vddx)前面的.*不能匹配白色的space字符,所以要用\S*.

请注意,无法正确保留单词之间的 space - 即 a vssx b 将变为 ab

regex101 demo.

我认为正则表达式就是

$var =~ s/\S*(vssx|vddx)\S*/ /g;