为什么我在我的正则表达式中取代'替换未被终止'以取代C风格的评论?

时间:2013-03-22 18:58:59

标签: regex perl

尝试删除C风格的评论及其分隔符。看起来很简单,但我正在转动轮子。这就是我想要的:

$code =~ s/\/\*.+\*\//g;

然而,我得到的错误是:

Substitution replacement not terminated

怎么办?

3 个答案:

答案 0 :(得分:12)

替换替换采用以下形式:

s/FIND/REPLACE/FLAGS

请注意,分隔符可以是多个字符中的任何一个。因此,在处理包含斜杠的模式时,通常最好使用不同的分隔符,例如#

您的替换替换位置缺少替换部分。如果我们使用#而不是/作为分隔符,这可能更清楚:

$code =~ s#\/\*.+\*\/#g;

您可能打算使用的是:

$code =~ s/\/\*.+\*\///g;

或者为了清楚起见,

$code =~ s#/\*.+\*/##g;

请注意,由于#被用作分隔符,因此不再需要转义/

答案 1 :(得分:1)

你打算写$code =~ s/\/\*.+\*\///g;

您不必在模式中使用倾斜的牙签:

$code =~ s{ /[*] .+ [*]/ }{}gx;

虽然,你可能会意识到这并不能很好地处理所有可能性。为此,请参阅How can I strip multiline C comments from a file using Perl?

答案 2 :(得分:1)

this thread,以下工作:

$code =~ s#/\*.*?\*/##sg;