我知道我可以使用[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,指定类中的字符集。
第二种模式可行,但它有下划线(和数字)。很好,它适用于生产线的开始。
第三种模式是试图将正则表达式存储到变量中以缩写含义,但它显然失败了。
答案 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";