Regex perl字符串匹配问题

Regex perl字符串匹配问题,regex,perl,Regex,Perl,我有一个脚本,我需要跳过评论,我能够实现它的一部分 IN : {**************************** {test : test...test } Script: if ( $data =~ m/(^{\*+$)/ ){ } 通过以上匹配,我能够识别注释并跳过它以获得下一行 Out: {test : test...test } 如果同一注释在*处包含任何空格或任何字符,则“我的匹配”将失败 IN: {** ***** or {* abccd or {*

我有一个脚本,我需要跳过评论,我能够实现它的一部分

IN :

{****************************
{test : test...test }

Script:

if ( $data =~  m/(^{\*+$)/ ){
}
通过以上匹配,我能够识别注释并跳过它以获得下一行

Out:
{test : test...test }
如果同一注释在*处包含任何空格或任何字符,则“我的匹配”将失败

IN:
{** *****    or   {* abccd   or {*abce
以上所有案例都无法跳过。。。
你的正则表达式中的
$
是一个锚,表示字符串/行的结尾,它坚持只有当你在初始
{
之后有一行
*
时,匹配才会发生

移除此锚定将允许所有三种情况匹配:

for ( '{*********', '{** *****', ,'{* abccd' , '{*abce' ) {

    print "$_ Matches\n" if /^{\*+/;
}

现在还不清楚文本中注释的语法是什么,但是给出了示例,我将假设一行开头的
{*
,后面是直到行末的任何内容,都是注释

在这种情况下,您的正则表达式
/(^{\*+$)/
将不起作用。也就是说:

  • ^
    -匹配行首
  • {
    -匹配
    {
  • \*+
    -匹配一个或多个
    *
    s
  • $
    -匹配行尾
  • 如果在
    *
    s和行尾之间出现任何其他内容,则此模式将不匹配


    类似于
    /^{\*.+$/
    的内容应该可以满足您的需要。这会更改您的模式以匹配一个或多个非换行字符(即
    ),直到您到达行尾。

    如果您想在
    {*
    部分后面允许一些其他字符,那么只需从模式中删除
    $

    这是一个简单的Perl代码,您可以从以下代码开始:

    @data = <main::DATA>;
    print map { $_ if !/^{\*+/ } @data;
    
    __DATA__
    {****************************
    {test : test...test}
    

    测试这段代码。

    我试图删除锚,但我确实收到了一个错误…说..“在串联(.)或字符串中使用未初始化值”@NEW:行号是否与正则表达式匹配,还是另一行?我尝试使用相同的锚,但确实收到了一个错误…说..“在串联(.)或字符串中使用未初始化值”该警告(不是错误)与您可能使用的特定正则表达式无关。请找出未定义的值并定义它。
    {test : test...test}