Regex 在解析过程中,在最接近的下一个单词前加一个“*”

Regex 在解析过程中,在最接近的下一个单词前加一个“*”,regex,perl,parsing,Regex,Perl,Parsing,我在正文中有以下一行: int* a, b; 预期结果是: int *a, b; 下面的Perl代码应该产生预期的行: $line =~ s#\s*\*\s*#\s\*#g; 不幸的是,结果如下: int*a, b; 正则表达式有什么问题?只需更改: $line =~ s#\s*\*\s*#\s\*#g; 作者: \s在替换零件中无效。我认为您不能使用\s进行替换;它在搜索中表示一个字符类(空格,包括空格、制表符等),但在替换中类没有意义。使用普通空格。也试试这个 $line =~ s

我在正文中有以下一行:

int* a, b;
预期结果是:

int *a, b;
下面的
Perl
代码应该产生预期的行:

$line =~ s#\s*\*\s*#\s\*#g;
不幸的是,结果如下:

int*a, b;
正则表达式有什么问题?

只需更改:

$line =~ s#\s*\*\s*#\s\*#g;
作者:


\s
在替换零件中无效。

我认为您不能使用
\s
进行替换;它在搜索中表示一个字符类(空格,包括空格、制表符等),但在替换中类没有意义。使用普通空格。

也试试这个

$line =~ s/(\S)\*(?=\s+)\s*/$1 \*/;

@Alex:正如Amadan所说,
\s
表示表示所有“空格”字符的字符类。@Alex,
s///
的右侧被视为字符串,而不是正则表达式。更具体地说,替换部分只是一个普通的双引号字符串,其转义码是双引号字符串。字符串和正则表达式有不同(尽管重叠)的转义集。
\s
是表示字符类的仅正则表达式转义。
$line =~ s/(\S)\*(?=\s+)\s*/$1 \*/;