Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我能否在perl regex';中从单词字符集中消除下划线;s_Regex_Perl - Fatal编程技术网

我能否在perl regex';中从单词字符集中消除下划线;s

我能否在perl regex';中从单词字符集中消除下划线;s,regex,perl,Regex,Perl,我知道我可以只使用[a-zA-Z0-9]或使用[::alnum::]正则表达式类。但是我想解析很多latex宏,这些宏不允许宏名称中包含'(和/或数字),这可能会很快变得非常乏味,特别是因为我想经常使用\b字符。问题标题只提到下划线,但它实际上是一个更一般的问题 例如: my $FOUNDNUM=(s/\\$known\b/\\$xltd{$known}/g); 是否可以一次性更改word类中的字符集? 我想答案是否定的(我找不到pragma或特殊变量),但我想再次检查 编辑:澄清: my $

我知道我可以只使用
[a-zA-Z0-9]
或使用
[::alnum::]
正则表达式类。但是我想解析很多latex宏,这些宏不允许宏名称中包含
'
(和/或数字),这可能会很快变得非常乏味,特别是因为我想经常使用
\b
字符。问题标题只提到下划线,但它实际上是一个更一般的问题

例如:

my $FOUNDNUM=(s/\\$known\b/\\$xltd{$known}/g);
是否可以一次性更改word类中的字符集?

我想答案是否定的(我找不到pragma或特殊变量),但我想再次检查

编辑:澄清:

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,指定类中的字符集

第二种模式本来可以工作,但它有下划线(和数字)。很好,它在生产线的开始工作


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

最好的解决方案来自Casimirithippolyte(谢谢!)。虽然不可能替换'\b',但我们可以为零长度断言定义regex的前端,一个锚定在开始,一个锚定在结束

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";

my$b1=qr/(?事实上答案是否定的,您可以使用类
[^\W\uu]
并将
\b
替换为
(?和
(?![^\W\u])
。这是我看到的最短的方法。在较新的perls中,人们也可以定义自定义命名字符类,但使用这种自定义字符类比任何其他方法都需要更多的语法——至少在本例中是这样。从问题上看,你想做什么还不清楚。你描述了你想怎么做,但没有描述什么…@casimirithippolyte-you缺少一个匹配项-Hi123。您需要添加
\d
,即
(?。否则,我认为您应该将此作为答案,因为这是一种解决方法。您可能需要解释负面环视是如何为零长度断言的。
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";