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
。
我认为正则表达式就是
$var =~ s/\S*(vssx|vddx)\S*/ /g;
我正在尝试删除所有包含两个键的单词(在 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
。
我认为正则表达式就是
$var =~ s/\S*(vssx|vddx)\S*/ /g;