我可以普遍地从perl正则表达式中的单词字符集中删除下划线吗?

时间:2014-01-25 18:14:07

标签: regex perl

我知道我可以使用[a-zA-Z0-9]或使用[::alnum::]正则表达式类。但我想解析很多乳胶宏,这些宏不允许宏名中的'_'(和/或数字),这可能会很快变得非常繁琐,特别是因为我想使用{{1性格很多。问题标题只是提到了下划线,但它确实是一个更普遍的问题。

例如:

\b

是否可以一劳永逸地更改单词类中的字符集?

我认为答案是否定的(我找不到编译指示或特殊变量),但我想仔细检查。

编辑:澄清:

my $FOUNDNUM=(s/\\$known\b/\\$xltd{$known}/g);

产量

my $b=qr/(?<![^a-zA-Z])/;

my $v= "Hi 1 Hi aHi Hia Hi123 Hi_3 _Hi_";

print "     In:\t'$v'\n";
print "Desired:\t'** 1 ** aHi Hia **123 **_3 _**_\n\n";
$_ = $v; print "".(s/([^a-zA-Z])Hi([^a-zA-Z])/$1**$2/g)." times to:\t'$_'\n";
$_ = $v; print "".(s/\bHi\b/**/g)." times to:\t'$_'\n";
$_ = $v; print "".(s/${b}Hi${b}/**/g)." times to:\t'$_'\n";

第一个模式几乎可以工作(除了在字符串的开头),除了它要求我使用$ 1和$ 2,指定类中的字符集。

第二种模式可行,但它有下划线(和数字)。很好,它适用于生产线的开始。

第三种模式是试图将正则表达式存储到变量中以缩写含义,但它显然失败了。

1 个答案:

答案 0 :(得分:1)

最佳解决方案来自CasimiretHippolyte(谢谢!)。虽然不可能替换'\ b',但我们可以为零长度断言预先定义正则表达式,一个在开始时锚定,一个在最后锚定。

my $b1=qr/(?<![^\W_\d])/;
my $b2=qr/(?![^\W_\d])/;

my $v= "Hi 1 Hi aHi Hia Hi123 Hi_3 _Hi_ 3Hi";

print "     In:\t'$v'\n";
print "Desired:\t'** 1 ** aHi Hia **123 **_3 _**_ 3**\n\n";
$_ = $v; print "".(s/${b1}Hi${b2}/**/g)." times to:\t'$_'\n";
$_ = $v; print "".(s/(?<![^\W_\d])Hi(?![^\W_\d])/**/g)." times to:\t'$_'\n";